• 工厂设计模式


    githubGitHub - QiuliangLee/pattern: 设计模式

    概念

    根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。

    简单工厂模式、工厂方法模式和抽象工厂模式有何区别? - 知乎本篇详解简单工厂、工厂方法和抽象工厂,建议关注和收藏。在我们平常创建对象的时候,都是通过关键字 new…icon-default.png?t=N7T8https://www.zhihu.com/question/27125796/answer/1615074467

    开闭原则 ocp: —个软件实体,应该对扩展开放,对修改关闭

    应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化

    简单工厂:唯一工厂类,一个产品抽象类,工厂类的创建方法依据入参判断并创建具体产品对象。

    工厂方法:多个工厂类,一个产品抽象类,利用多态创建不同的产品对象,避免了大量的if-else判断。

    抽象工厂:多个工厂类,多个产品抽象类,产品子类分组,同一个工厂实现类创建同组中的不同产品,减少了工厂子类的数量。

    需求分析

    我想生产一批鼠标,鼠标品牌目前只有”联想“,”惠普“。惠普鼠标

    没有工厂模式

    缺点:不符合ocp

    联想鼠标

    1. public class LenovoMouse{
    2. public void build() {
    3. System.out.println("生产联想鼠标");
    4. }
    5. }

    惠普鼠标

    1. public class HPMouse{
    2. public void build() {
    3. System.out.println("生产惠普鼠标");
    4. }
    5. }

    MouseDemo 

    1. package com.lql.factory.no;
    2. import com.lql.factory.entity.HpMouse;
    3. import com.lql.factory.entity.LenovoMouse;
    4. import com.lql.factory.enums.MouseEnum;
    5. public class MouseDemo {
    6. public void getMouse(Integer type) {
    7. if (MouseEnum.LENOVO_MOUSE.getCode().equals(type)) {
    8. LenovoMouse lenovoMouse = new LenovoMouse();
    9. lenovoMouse.build();
    10. } else if (MouseEnum.HP_MOUSE.getCode().equals(type)) {
    11. HpMouse hpMouse = new HpMouse();
    12. hpMouse.build();
    13. } else {
    14. throw new IllegalArgumentException("无效的鼠标:" + type);
    15. }
    16. }
    17. }

    简单工厂模式

    定义一个工厂类,根据传入的参数的值不同返回不同的实例,使得产品类满足OCP

    特点:被创建的实例具有共同的父类或接口

    使用场景:

    1. 客户端不关心对象的创建过程
    2. 需要创建的对象较少,修改对象不符合开闭原则.

    缺点:工厂不满足OCP

    Mouse接口
    1. package com.lql.factory.entity;
    2. public interface Mouse {
    3. void build();
    4. }
    LenovoMouse
    1. package com.lql.factory.entity;
    2. public class LenovoMouse implements Mouse {
    3. @Override
    4. public void build() {
    5. System.out.println("生产联想鼠标");
    6. }
    7. }
    HpMouse
    1. package com.lql.factory.entity;
    2. public class HpMouse implements Mouse {
    3. @Override
    4. public void build() {
    5. System.out.println("生产惠普鼠标");
    6. }
    7. }
    MouseEnum
    1. package com.lql.factory.enums;
    2. import lombok.AllArgsConstructor;
    3. import lombok.Getter;
    4. @AllArgsConstructor
    5. @Getter
    6. public enum MouseEnum {
    7. LENOVO_MOUSE(1, "联想鼠标"),
    8. HP_MOUSE(2, "惠普鼠标");
    9. private final Integer code;
    10. private final String desc;
    11. }
    MouseFactory
    1. package com.lql.factory.simplefactory;
    2. import com.lql.factory.entity.HpMouse;
    3. import com.lql.factory.entity.LenovoMouse;
    4. import com.lql.factory.entity.Mouse;
    5. public class MouseFactory {
    6. public static Mouse createMouse(Integer type) {
    7. switch (type) {
    8. case 1:
    9. return new LenovoMouse();
    10. case 2:
    11. return new HpMouse();
    12. default:
    13. return new LenovoMouse();
    14. }
    15. }
    16. }

    工厂模式

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

    对类的实例化延迟到其子类

    特点:不违反开闭原则(增加联想鼠标,不用修改已有代码,增加新的接口,LenvoMouse和 LenvoMouseFactory)

    缺点:

    (1)添加子类的时候”拖家带口”

    (2)只支持同一类产品的创建

    MouseFactory
    1. package com.lql.factory.factorymethod;
    2. import com.lql.factory.entity.Mouse;
    3. public interface MouseFactory {
    4. Mouse createMouse();
    5. }
    LenovoMouseFactory
    1. package com.lql.factory.factorymethod;
    2. import com.lql.factory.entity.LenovoMouse;
    3. import com.lql.factory.entity.Mouse;
    4. public class LenovoMouseFactory implements MouseFactory {
    5. @Override
    6. public Mouse createMouse() {
    7. return new LenovoMouse();
    8. }
    9. }
    HpMouseFactory
    1. package com.lql.factory.factorymethod;
    2. import com.lql.factory.entity.HpMouse;
    3. import com.lql.factory.entity.Mouse;
    4. public class HpMouseFactory implements MouseFactory {
    5. @Override
    6. public Mouse createMouse() {
    7. return new HpMouse();
    8. }
    9. }
    FactoryMethodDemo
    1. package com.lql.factory.factorymethod;
    2. import com.lql.factory.entity.Mouse;
    3. public class FactoryMethodDemo {
    4. public static void main(String[] args) {
    5. MouseFactory mf = new HpMouseFactory();
    6. Mouse mouse = mf.createMouse();
    7. mouse.build();
    8. }
    9. }

    抽象工程模式

    提供一个创建一系列相关或相互依赖对象的接口

    (1)抽象工厂模式侧重的是同一产品族(比如鼠标和键盘,统一厂商)

    (2)工厂方法模式更加侧重于同一产品等级(比如鼠标)

    增加主板时还是违背开闭原则,可以采用spring ioc与工厂模式相结合的方式解决.

    Keyboard
    1. package com.lql.factory.entity;
    2. public interface Keyboard {
    3. void build();
    4. }
    LenovoKeyboard
    1. package com.lql.factory.entity;
    2. public class LenovoKeyboard implements Keyboard {
    3. @Override
    4. public void build() {
    5. System.out.println("生产联想键盘");
    6. }
    7. }
    HpKeyboard
    1. package com.lql.factory.entity;
    2. public class HpKeyboard implements Keyboard {
    3. @Override
    4. public void build() {
    5. System.out.println("生产惠普键盘");
    6. }
    7. }
    ComputerFactory
    1. package com.lql.factory.absfactory;
    2. import com.lql.factory.entity.Keyboard;
    3. import com.lql.factory.entity.Mouse;
    4. public interface ComputerFactory {
    5. Mouse createMouse();
    6. Keyboard createKeyboard();
    7. }
    LenovoComputerFactory
    1. package com.lql.factory.absfactory;
    2. import com.lql.factory.entity.Keyboard;
    3. import com.lql.factory.entity.LenovoKeyboard;
    4. import com.lql.factory.entity.LenovoMouse;
    5. import com.lql.factory.entity.Mouse;
    6. public class LenovoComputerFactory implements ComputerFactory {
    7. @Override
    8. public Mouse createMouse() {
    9. return new LenovoMouse();
    10. }
    11. @Override
    12. public Keyboard createKeyboard() {
    13. return new LenovoKeyboard();
    14. }
    15. }
    DellComputerFactory
    1. package com.lql.factory.absfactory;
    2. import com.lql.factory.entity.DellKeyboard;
    3. import com.lql.factory.entity.DellMouse;
    4. import com.lql.factory.entity.Keyboard;
    5. import com.lql.factory.entity.Mouse;
    6. public class DellComputerFactory implements ComputerFactory {
    7. @Override
    8. public Mouse createMouse() {
    9. return new DellMouse();
    10. }
    11. @Override
    12. public Keyboard createKeyboard() {
    13. return new DellKeyboard();
    14. }
    15. }

    AbstractFactoryDemo
    1. package com.lql.factory.absfactory;
    2. import com.lql.factory.entity.Keyboard;
    3. import com.lql.factory.entity.Mouse;
    4. public class AbstractFactoryDemo {
    5. public static void main(String[] args) {
    6. ComputerFactory cf = new HpComputerFactory();
    7. Mouse mouse = cf.createMouse();
    8. Keyboard keyboard = cf.createKeyboard();
    9. mouse.build();
    10. keyboard.build();
    11. }
    12. }

  • 相关阅读:
    找不到msvcr110.dll丢失的解决方法-常见修复方法分享
    实现Ubuntu与Nvida Nano远程连接
    解决若依框架中只适配MySQL的问题,若依框架完美适配达梦数据库的代码生成,适配其他框架原理相似。
    [附源码]Python计算机毕业设计Django的高校课程知识库
    python结合Airtest框架APP自动化
    【Harmony OS】【JAVA UI】鸿蒙系统中怎么使用Parcel进行存储数据或数据传递
    手机java游戏下载网站
    【MySQL必知必会】 表的优化 | 充分利用系统资源
    【通信原理】确知信号的性质分析与研究
    omnipathr官网教程 mistr
  • 原文地址:https://blog.csdn.net/weixin_44484668/article/details/132787358