工厂模式

工厂模式是最常用的一类创建型设计模式,最为基础的设计模式。

工厂模式一般是三种,分别是工厂方法模式、简单工厂模式、抽象工厂模式。通常所说的工厂模式是工厂方法模式。

一:简单工厂模式

参考博客:

https://blog.csdn.net/lovelion/article/details/9300337

https://blog.csdn.net/lovelion/article/details/9300549

https://blog.csdn.net/lovelion/article/details/9300657

https://blog.csdn.net/lovelion/article/details/9300731

(刘伟老师的博客讲解这部分内容十分详细,我只写一点梗概)

参考书籍:《大话设计模式》第一章

到底要实例化谁,将来会不会增加实例化对象,应该考虑用一个单独的类来做这个创造实例的过程,这就是工厂。

工厂(Creator)角色

简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。

抽象产品(Product)角色

简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

具体产品(Concrete Product)角色

是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

LintCode中的例题:https://blog.csdn.net/vestlee/article/details/80569188

简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖,但如果增添新功能,我们需要给工厂类的方法里增加‘case’的分支条件。开放了扩展与修改,违反了“开放-封闭原则”。

二:工厂方法模式(factory Method)

参考博客:

https://blog.csdn.net/lovelion/article/details/9306457

https://blog.csdn.net/lovelion/article/details/9306745

https://blog.csdn.net/lovelion/article/details/9307137

https://blog.csdn.net/lovelion/article/details/9307561

参考书籍:《大话设计模式》第8章

既然这个简单工厂模式的工厂类与分支耦合,根据依赖倒转原则,把工厂类抽象出一个接口,这个接口只有一个方法:创建抽象产品的工厂方法。然后,所有所有的要生产具体类的工厂,就去实现这个接口。这样一个简单工厂模式的工厂类变成了一个工厂抽象接口和多个具体生成对象的工厂。

工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,工厂方法模式把简单工厂的内部判断逻辑转移到了客户端代码来进行。

定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类


工厂方法模式是简单工厂模式的进一步抽象和推广,使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。但缺点是由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。

C++代码实现:https://www.cnblogs.com/fenglangxiaotian/p/5671153.html

三:抽象工厂模式(Abstract Factory)

参考博客:

https://blog.csdn.net/lovelion/article/details/9319181

https://blog.csdn.net/lovelion/article/details/9319323

https://blog.csdn.net/lovelion/article/details/9319423

https://blog.csdn.net/lovelion/article/details/9319481

https://blog.csdn.net/lovelion/article/details/9319571

参考书籍:《大话设计模式》第15章

提供一个创建一系列相关或互相依赖对象的接口,而无需指定他们具体的类。


AbstractProductA和AbstractProductB是两个抽象产品,它们都有多种不同的实现。

ProductA1、ProductA2,ProductB1,ProductB2就是两个抽象产品的具体分类的实现。

AbstractFactory是一个抽象工厂接口,里面包含有所有的铲平创建的抽象方法。

ConcreteFactory1和ConcreteFactory2是具体的工厂。

在运行时刻再创建一个concreteFactory类的实例,这个具体的工厂再创建具有特定实现的产品对象。为创建不同的产品对象,客户端应使用不同的具体工厂。

优点:易于交换产品系列,由于具体工厂类,在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易。它只需要改变具体工厂即可使用不同的产品设置。具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操作实例,产品的具体类名也被具体的实现分离。不会出现在客户代码中。

缺点:增加功能时,要改动的类过多。每一个客户端程序类都需要声明一次抽象工厂接口。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值