一,工廠方法模式和單例模式
工廠方法模式中有一個抽象的工廠介面和一個抽象的產品介面。然後,具體的工廠實現抽象工廠並負責生產具體的產品。由客戶端決定 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,告訴它去建立 某種作業配置型別就可以了。