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