用到的設計模式總結--單例模式+工廠方法模式+Builder模式

weixin_34120274發表於2016-06-24

一,工廠方法模式和單例模式

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

 

相關文章