工厂模式--从无工厂模式到工厂模式的变化

简单工厂

定义

在创建一个对象时,不向客户暴露内部细节,并提供一个创建对象的通用接口

类图

简单工厂把实例化的操作单独放到一个类中,这个类就称为简单工厂类,让简单工厂类来就决定应该用哪个具体子类来实例化。

这样做能把客户类和具体子类的实现解耦,客户类不再需要知道有哪些子类以及应当实例化哪个子类。客户类往往有多个,如果不使用简单工厂,那么素偶又的客户类都要知道所有子类的细节。而且一旦子类发生改变,例如增加子类,那么所有的客户类都要进行修改。

mark

简单工厂在JDK的应用

JDK中的Calendar使用了简单工厂

工厂方法

定义

定义了一个创建对象的接口,由子类决定要实例化哪个类。工厂方法把实例化操作推迟到子类。

类图

在简单工厂中,创建对象的是工厂类,而在工厂方法中,是由子类来创建对象。

mark

抽象工厂

定义

提供一个接口,用于创建相关的对象家族

Class Diagram

抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,并且这些对象是相关的,也就是说必须一起创建出来。而工厂方法模式只是用于创建一个对象,这和抽象工厂模式有很大不同。

抽象工厂模式用到了工厂方法模式来创建单一对象,AbstractFactory中的createProductA()createProductB()方法都是让子类来实现,这两个方法单独来看就是在创建一个对象,这符合工厂方法模式的定义。

至于创建对象的家族这一概念实在Client体现,Client要通过AbstractFactory同时调用两个方法来创建出两个对象,在这里这两个对象就有很大的相关性,Client需要同时创建出这两个对象。

从高层次来看,抽象工厂使用了组合,即Client组合了AbstractFactory,而工厂方法模式使用了继承。

mark

个人理解:我认为抽象工厂模式完全是多态的其中一个体现,我在实际开发中使用的可能只是子类,但子类也完全可以呈现出父类的样子,例如我们常写的:List<Integer> list = new ArrayList<>()

工厂模式小结

  1. 工厂模式的意义

    将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。

  2. 三种工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)

  3. 设计模式的依赖抽象原则

    • 创建对象实例时,不要直接new类,而是把这个new类的动作放在一个工厂的方法中,并返回。(加一个缓冲区)
    • 不要让类继承具体类,而是继承抽象类或者是实现interface(接口)
    • 不要覆盖基类中已经实现的方法

个人理解

依旧是用一个例子类配合自己的理解,例如特斯拉汽车工厂,在没有工厂以前,我需要什么特斯拉我就直接new一个特斯拉出来,在业务逻辑简单的时候,这样子的方式完全没问题,但这样会有很多的if else分支,而且当需要增加一个新的特斯拉类的时候,改动的代码很多,于是就需要使用简单工厂,将这些new的过程封装到工厂里面,你需要什么我给你什么,这样子的简单工厂是只生产一个类的,例如我就只是特斯拉的工厂,不能生产宝马。

随着我的业务扩张,我的要求也更多了,我现在不止要在中国生产特斯拉,我还要在新加坡生产特斯拉,这个时候以前的简单工厂就不适用了,因为中国生产的特斯拉跟新加坡生产的特斯拉虽然流程都一样的,但其中肯定会有不一样的细节,因此不用直接套用中国工厂,于是工厂方法也就产生了,我在工厂类中对方法进行抽象,将实例化的过程放到工厂类的子类中,于是中国的工厂实现自己的生产工厂,新加坡的工厂实现自己的生产工厂,这便是工厂方法。

上述两个设计模式呢,解决的都是单个类的问题,如果我需要生产不同的类,例如我除了上产汽车,我还生产摩托车,那么原来的简单工厂以及工厂方法就不再适用了,要使用抽象工厂,就是对工厂方法再进行一层抽象,使用一个抽象工厂统一管理一个工厂家族,工厂家族中的每个工厂类使用工厂方法,这便是抽象工厂的设计模式。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值