工厂模式

定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。

一个通用栗子如下:

 1 //抽象产品类
 2 public abstract class Product{
 3     public void method1(){}
 4     public void method2(){}
 5 }
 6 //具体产品类
 7 public class ConcreateProduct1 extends Product{
 8     public void method1(){}
 9 }
10 public class ConcreateProduct2 extends Product{
11     public void method2(){}
12 }
13 //抽象工厂类
14 public abstract class Creator{
15     //创建一个产品对象,其输入参数类型可以自行设置
16     //可以为String,Enum,Class等 也可以为空
17     public abstract <T extends Product> T createProduct(Class<T> c);
18 }
19 //由具体工厂类产生具体的产品对象
20 public class ConcreateCreator extends Creator{
21     public <T extends Product> T createProduct(Class<T> c){
22         Product  product = null;
23         try{
24             product = (Product)Class.forName(c.getName()).newInstance();
25         }catch(Exception e){
26             //异常处理
27         }
28         return (T)product;
29 }
30 //场景调用方法
31 public class Client{
32     public static void main(String[] args){
33         Creator creator = new ConcreateCreactor();
34         Product product = creator.createProduct(ConcreateProduct1 .class);
35     }
36 }

上述只是一个简单示例,根据需要可自由扩展,工厂模式有以下优点:

  • 具有良好封装性,代码结构清晰。只要给定一个类名或约束字符串就可以得到一个具体对象,封装了复杂的创建过程,降低了耦合性;
  • 良好的扩展性,是一个典型的解耦框架。适当修改工厂类或简单的扩展,就可以应对产品类的变化,符合迪米特原则、依赖倒置原则、里氏替换原则;
  • 屏蔽产品类。不关心产品类的变化,只关注产品的接口,比如使用JDBC连接数据库,当从MYSQL迁移到ORACLE时,只需要修改下驱动名称即可,方便又灵活。

 

posted @ 2018-09-19 23:23  行者林  阅读(117)  评论(0编辑  收藏  举报