工厂方法模式

xiaoxiao2021-02-28  95

*说明:本文参考书籍《设计模式之禅》第2版,作者:秦小波,章节:第8章。

1.定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类。

工厂方法使一个类的实例化延迟到其子类。

 

2.通用类图

*说明:

抽象产品类Product负责定义产品的共性,实现对事物的最抽象的定义。抽象工厂类Creator,具体如何创建产品类是由具体的实现工厂ConcreteCreator完成的。

 

3.通用代码

3.1抽象产品类

[java]  view plain  copy public abstract class Product {       //产品类的公共方法       public void method1(){           //业务逻辑处理       }       //抽象方法       public abstract void method2(); //抽象方法没有方法体   }  

3.2具体产品类

具体的产品类可以有多个,都继承了抽象产品类。

[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(){           //业务逻辑处理       }   }  

3.3抽象工厂类

抽象工厂类负责定义产品对象的产生。

[java]  view plain  copy public abstract class Creator {       //用于创建一个产品对象,其输入参数类型可以自行设置,通常为String、Enum、Class等,也可为空       public abstract <T extends Product> T createProduct(Class<T> c);   }  

3.4具体工厂类

具体的工厂产生具体的产品。

[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;       }   }  

3.5场景类

[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的业务处理       }   }  

4.优缺点

4.1优点

良好的封装性,代码结构清晰,降低了模块间的耦合优秀的扩展性屏蔽了产品类,调用者只关心产品的接口工厂方法模式是典型的解耦框架

4.2缺点

每增加一个产品,相应的也要增加一个子工厂,导致系统中类的个数增加,在一定程度上增加了系统的复杂度。

 

5.使用举例

设计一个连接邮件服务器的框架时,有3种网络协议可供选择:POP3、IMAP、HTTP,我们可以把这三种连接方法作为产品类,定义一个接口如IConnectMail,然后定义对邮件的操作方法,用不同的方法实现三个具体的产品类(也就是连接方式);再定义一个工厂方法,按照不同的传入条件,选择不同的连接方式。如此设计,可以做到完美扩展。

转载请注明原文地址: https://www.6miu.com/read-82881.html

最新回复(0)