🌸 HeadFirst(design-patterns)最经典的23种设计模式——工厂模式 🌸
- 创建型模式:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
- 结构型模式:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、蝇量模式(享元模式)。
- 行为型模式:策略模式、模板方法模式、观察者模式、迭代模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
源码
- github上大佬用java8重写的源码
https://github.com/bethrobson/Head-First-Design-Patterns.git
- gitee上加上中文注释源码(还在学习中)
https://gitee.com/chen934298133/design-patterns.git
🌸 本文结合《HeadFirst-设计模式》和这个例子 🌸
1. 工厂模式(代码较多,记得去拿源码运行理解)
1.1 简单工厂
-
重点:将创建子类的方法拿出来封装成工厂方法
- 即把new操作符 替换 成工厂对象的创建方法,不再使用具体的实力化
-
注意此时只有一个抽象类(产品),其他是简单工厂(能管理并直接创建所有产品)
- 注意看后面的工厂方法,多了一个抽象类(抽象工厂类——注意和抽象工厂模式不是一个东西)
- 注意看后面的工厂方法,多了一个抽象类(抽象工厂类——注意和抽象工厂模式不是一个东西)
-
奔驰车例子重点
- 具体代码见:
https://gitee.com/chen934298133/design-patterns/tree/master/factory/a_cars_simplefactory1
- 具体代码见:
-
Headfirst例子重点
- 具体代码见:
https://gitee.com/chen934298133/design-patterns/tree/master/factory/a_pizzas_simpleFactory
- 具体代码见:
-
每多一个产品都需要修改工厂类,违法开闭原则(对拓展开发,对修改关闭)
1.2 工厂方法
- 定义:
- 定义一个创建对象的接口,但有子类决定要实力化的类是哪一个,工厂方法让类把实力化推迟到子类。
- 重点:
- 子类来决定创建的对象,创建者不需要知道创建了哪种具体的产品
- 说人话就是:把创建产品的方法交给抽象工厂的抽象方法中,在每个子类中传入参数决定创建什么产品
- 这个例子,两个地方用到了工厂方法?
- 注意此时有两个抽象类(产品、工厂),这就是抽象工厂模式吗?并不是,这里只是有一个抽象工厂类,注意区别。
- 具体代码见:
https://gitee.com/chen934298133/design-patterns/tree/master/factory/b_pizzafm_factorymothod
- 每多一个产品都不需要修改工厂类,
新增
产品去继承抽象产品类+新增
具体工厂去继承抽象工厂类,复合开闭原则(对拓展开发,对修改关闭)
1.3 抽象工厂
- 细分对比抽象工厂中的工厂方法
- 多了产品树产品族的概念,即HeadFirst中的原料工厂
- 抽象工厂中是使用工厂方法来实现具体工厂,创建工厂中的产品
- 我的个人理解也不知道对不对,可以一起讨论。
- 我的个人理解也不知道对不对,可以一起讨论。
比较抽象工厂和工厂方法
- 在子类实例化还是自己实例化的地方我没太理解,但是这两者给我最大的收获是遇到单一产品类的时候从产品本身去设计(华为手机/小米手机等),在多个产品类的时候重点从产品类别去设计。(如商务手机/电竞手机/休闲手机等)
工厂方法模式: | 抽象工厂模式 |
---|---|
由子类自行决定实例化那个类 | 自己决定实例化哪个类 |
针对的是一个产品等级结构 | 针对的是面向多个产品等级结构 |
一个抽象产品类 | 多个抽象产品类 |
可以派生出多个具体产品类 | 每个抽象产品类可以派生出多个具体产品类 |
一个抽象工厂类,可以派生出一个具体工厂类 | 一个抽象工厂类,可以派生出多个具体工厂类 |
每个具体工厂类只能创建一个具体产品类的实例 | 每个具体工厂类可以创建多个具体产品类的实例 |
- 关于组合:
- 工厂方法是由子类自行决定实例化那个类,而抽象工厂是自己决定实例化哪个类。至于是组合还是继承还是实现接口都无所谓,用组合更好。根本区别在于是自己实例化还是子类实例化。(但是我没理解这句话的意思,什么样是自己实例化,什么样是子类实例化?我感觉都是子类在实例化)
抽象工厂和service/serviceImpl对比
-
初看感觉奇怪特别像,其实和抽象工厂完全没有任何关系
-
具体代码见:
https://gitee.com/chen934298133/design-patterns/tree/master/factory/c_pizzaaf_abstartfactory