定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
一个通用栗子如下:
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时,只需要修改下驱动名称即可,方便又灵活。