用到的设计模式总结--单例模式+工厂方法模式+Builder模式

一,工厂方法模式和单例模式

工厂方法模式中有一个抽象的工厂接口和一个抽象的产品接口。然后,具体的工厂实现抽象工厂并负责生产具体的产品。由客户端决定 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,告诉它去创建 某种作业配置类型就可以了。

 

posted @ 2016-06-24 10:55  大熊猫同学  阅读(2182)  评论(0编辑  收藏  举报