5分钟学设计模式之《工厂方法模式》

工厂方法模式

工厂方法模式是创建型设计模式的一种。它继承了简单工厂模式的优点,同时还弥补了简单工厂模式的缺陷,更好的符合开闭原则

先说说简单工厂模式存在的缺陷:如果要增加一个具体类,那么工厂类也要随之修改,这是不满足开闭原则的,只适用于具体类不会新增的情况

 

工厂方法模式是如何解决?

不再提供工厂类,而是定义一个抽象的工厂类,再定义具体的工厂类来创建具体类的对象。每个具体类一一对应一个工厂类

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

 

工厂方法模式类图设计

(1)  Product(抽象产品):它是定义产品的接口,是工厂方法模式所创建对象的超类型

(2) ConcreteProduct(具体产品类):它实现了抽象产品的接口。具体产品和具体工厂类是一一对应

(3) Factory(抽象工厂):声明了工厂方法,所有的具体工厂类都继承自抽象工厂。它是工厂方法模式的核心

(4) ConcreteFactory(具体工厂类):是抽象工厂的子类,实现了抽象工厂方法,并返回具体产品类的实例对象

 

工厂方法模式应用实例

    以我们常见的写日志为例,例如在实际开发中我们需要将日志输出到文件或者写入数据库。根据工厂模式设计原则,可以设计出如下类图:

 

      在基于上述的设计下,其实我们还可以简化使用,直接LoggerFacoty 中调用 Logger 的writeLog()方法,这样就无须先创建 Logger 类实例,再调用 writeLog()方法。简化后的类图如下:

 

工厂方法模式的适用环境

    首先我们可以总结一下工厂方法模式的优缺点

优点:

(1) 解决了简单工厂模式违反开闭原则的问题,具有良好的可扩展性

(2) 工厂方法模式可以向使用者隐藏具体产品类,只需要关系所需的工厂即可

(3) 能够让工厂自主决定创建何种产品,而创建对象的细节完全封装在具体工厂内部,因此工厂方法模式又称为多态工厂模式

缺点:

(1) 如果需要新增产品类,则需要同时新增对应的工厂类,增加了系统的类的数量

 

因此我们可以总结出工厂方法模式适用以下情况

(1) 使用者无须关心具体的产品类,只需要知道对应的工厂即可

(2) 抽象工厂类通过其子类来指定创建哪个对象,利用面向对象的多态性和里氏代换原则,在程序运行时子类覆盖父类对象,从而使得系统更容易扩展

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值