定义一个用于创建对象的接口,让子类决定实例化哪一个类。
工厂方法使一个类的实例化延迟到其子类。
*说明:
抽象产品类Product负责定义产品的共性,实现对事物的最抽象的定义。抽象工厂类Creator,具体如何创建产品类是由具体的实现工厂ConcreteCreator完成的。
具体的产品类可以有多个,都继承了抽象产品类。
[java] view plain copy /* 产品1 */ public class ConcreteProduct1 extends Product { public void method2(){ <span style="white-space:pre"> </span>//业务逻辑处理 } } /* 产品2 */ public class ConcreteProduct1 extends Product { public void method2(){ //业务逻辑处理 } }
抽象工厂类负责定义产品对象的产生。
[java] view plain copy public abstract class Creator { //用于创建一个产品对象,其输入参数类型可以自行设置,通常为String、Enum、Class等,也可为空 public abstract <T extends Product> T createProduct(Class<T> c); }
具体的工厂产生具体的产品。
[java] view plain copy public class ConcreteCreator extends Creator { public abstract <T extends Product> T createProduct(Class<T> c){ Product product = null; try { product = (Product)Class.forName(c.getName()).newInstance(); } catch (Exception e) { //异常处理 } return (T)product; } }
[java] view plain copy public class Client { public static void main(String[] args){ //实例化一个具体的工厂 Creator creator = new ConcreteCreator(); /* * 产生产品1 */ Product product1 = creator.createProduct(ConcreteCreator1.class); //-->继续完成产品1的业务处理 /* * 产生产品2 */ Product product2 = creator.createProduct(ConcreteCreator2.class); //-->继续完成产品2的业务处理 } }
设计一个连接邮件服务器的框架时,有3种网络协议可供选择:POP3、IMAP、HTTP,我们可以把这三种连接方法作为产品类,定义一个接口如IConnectMail,然后定义对邮件的操作方法,用不同的方法实现三个具体的产品类(也就是连接方式);再定义一个工厂方法,按照不同的传入条件,选择不同的连接方式。如此设计,可以做到完美扩展。
