工厂方法模式

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


1.定义

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

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

 

2.通用类图

image

*说明:

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

 

3.通用代码

3.1抽象产品类
[java]  view plain  copy
  1. public abstract class Product {  
  2.     //产品类的公共方法  
  3.     public void method1(){  
  4.         //业务逻辑处理  
  5.     }  
  6.     //抽象方法  
  7.     public abstract void method2(); //抽象方法没有方法体  
  8. }  
3.2具体产品类

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

[java]  view plain  copy
  1. /* 产品1 */  
  2. public class ConcreteProduct1 extends Product {  
  3.     public void method2(){  
  4.     <span style="white-space:pre">  </span>//业务逻辑处理  
  5.     }  
  6. }  
  7.   
  8. /* 产品2 */  
  9. public class ConcreteProduct1 extends Product {  
  10.     public void method2(){  
  11.         //业务逻辑处理  
  12.     }  
  13. }  

3.3抽象工厂类

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

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

3.4具体工厂类

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

[java]  view plain  copy
  1. public class ConcreteCreator extends Creator {  
  2.     public abstract <T extends Product> T createProduct(Class<T> c){  
  3.         Product product = null;  
  4.         try {  
  5.             product = (Product)Class.forName(c.getName()).newInstance();  
  6.         } catch (Exception e) {  
  7.             //异常处理  
  8.         }  
  9.         return (T)product;  
  10.     }  
  11. }  

3.5场景类

[java]  view plain  copy
  1. public class Client {  
  2.     public static void main(String[] args){  
  3.         //实例化一个具体的工厂  
  4.         Creator creator = new ConcreteCreator();  
  5.   
  6.         /* 
  7.          * 产生产品1 
  8.          */  
  9.         Product product1 = creator.createProduct(ConcreteCreator1.class);  
  10.         //-->继续完成产品1的业务处理  
  11.   
  12.         /* 
  13.          * 产生产品2 
  14.          */  
  15.         Product product2 = creator.createProduct(ConcreteCreator2.class);  
  16.         //-->继续完成产品2的业务处理  
  17.     }  
  18. }  

4.优缺点

4.1优点
  • 良好的封装性,代码结构清晰,降低了模块间的耦合
  • 优秀的扩展性
  • 屏蔽了产品类,调用者只关心产品的接口
  • 工厂方法模式是典型的解耦框架
4.2缺点
  • 每增加一个产品,相应的也要增加一个子工厂,导致系统中类的个数增加,在一定程度上增加了系统的复杂度。

 

5.使用举例

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值