一,工廠方法模式和單例模式
工廠方法模式中有一個抽象的工廠接口和一個抽象的產品接口。然后,具體的工廠實現抽象工廠並負責生產具體的產品。由客戶端決定 new 哪個具體的工廠,從而生產哪種產品。
因此,與簡單工廠模式相比,工廠方法將產品的選擇判斷交給了客戶端。而簡單工廠則是通過客戶端傳過來的生產哪種產品的類型通過 switch-case 在簡單工廠中判斷要生產哪種產品。
比如,對於Job而言,有編譯作業和普通用戶作業,如下:
此外,工廠采用單例模式來實現。即只有一個具體的工廠實例。
1 public class CompileJobFactory implements JobFactory { 2 3 //prevents instantiation 4 private CompileJobFactory() { 5 6 } 7 8 private static volatile CompileJobFactory compileJobFactory; 9 10 public static CompileJobFactory createInstance(){ 11 if(compileJobFactory == null){ 12 synchronized (CompileJobFactory.class) { 13 if(compileJobFactory == null) 14 compileJobFactory = new CompileJobFactory(); 15 } 16 } 17 return compileJobFactory; 18 } 19 //other method 20 }
注意:第8行的 volatile關鍵字。這樣可以避免內存的”亂序寫入“導致創建多個實例的情形。盡管已經使用了synchronized,但是還得用 volatile修飾單例引用。參考
所謂”亂序寫入“,在這里就是:先將 compileFactory 變量賦值,然后再創建對象。(正常順序是先創建好CompileFactory對象后,再將 compileFactory指向該對象)
這樣,在客戶端,可以這樣來使用工廠模式:可以看出,由客戶端判斷 創建哪種類型的工廠,進而創建何種類型的產品。
1 if(type.equals("0")){ 2 jobFactory = CompileJobFactory.createInstance(); 3 job = jobFactory.createJob(jsonStr); 4 }else if(type.equals("1")){ 5 jobFactory = CommonJobFactory.createInstance(); 6 job = jobFactory.createJob(jsonStr); 7 }
二,構造者(Builder)模式
對於每個Job都有一份 作業配置對象 與之對應。而生成每種作業的配置流程都是一樣的:包括三部分:版本配置、集群配置、和自定義配置。因此,可以用一個抽象類Builder定義好整個創建流程,再用Director類負責指揮創建哪種作業的配置。
1 public class JobConfigDirector { 2 3 private JobConfigBuilder jobConfig; 4 5 public JobConfigDirector(JobConfigBuilder jobConfig) { 6 this.jobConfig = jobConfig; 7 } 8 9 public String createJobConfig() { 10 return jobConfig.versionConfig().append(jobConfig.clusterConfig()) 11 .append(jobConfig.customeConfig()).toString(); 12 } 13 }
JobConfigDirector director = new JobConfigDirector(new CommonJobBuilder(appPath)); String jobConfig = director.createJobConfig();
在客戶端,把CommonJobBuilder對象傳遞給JobConfigDirector,告訴它去創建 某種作業配置類型就可以了。
