首页 > 其他分享 >设计模式学习(三):工厂模式

设计模式学习(三):工厂模式

时间:2022-11-07 22:45:32浏览次数:52  
标签:模式 public 工厂 go new 设计模式 class

设计模式学习(三):工厂模式

作者:Grey

原文地址:

博客园:设计模式学习(三):工厂模式

CSDN:设计模式学习(三):工厂模式

工厂模式

工厂模式是创建型模式,工厂模式分为:简单工厂,工厂方法和抽象工厂三种类型。

简单工厂

这个模式很简单,比如我们需要制造不同类型的鼠标,我们只需要创建一个鼠标工厂

public class MouseFactory {
    public static Mouse createMouse(int type) {
        switch (type) {
            case 1:
                return new HpMouse();
            case 2:
                return new LenovoMouse();
            case 0:
            default:
                return new DellMouse();
        }
    }

    public static void main(String[] args) {
        Mouse mouse = MouseFactory.createMouse(1);
        mouse.sayHi();
    }
}

根据不同的 type 来创建不同的鼠标即可。这个模式的缺点很明显,违反了开闭原则 ,所以我们引入工厂方法

工厂方法

工厂方法中,我们可以定义对应产品的对应工厂,以上面这个鼠标的例子为例,我们可以增加工厂的接口

public interface MouseFactory {
    Mouse createMouse();
}

不同类型的鼠标工厂实现这个工厂即可,以 Dell 鼠标工厂为例

public class DellMouseFactory implements MouseFactory {
    @Override
    public Mouse createMouse() {
        return new DellMouse();
    }
}

主函数在调用的时候,直接指定工厂即可制造对应的产品了:

public class FactoryMethodDemo {
    public static void main(String[] args) {
        MouseFactory mf = new HpMouseFactory();
        Mouse mouse = mf.createMouse();
        mouse.sayHi();
    }
}

工厂方法的优点是符合开闭原则,但是缺点也很明显,就是在增加子类的时候,同时要增加一个子类的工厂,而且,只支持同一类产品的创建,不适用于同一产品族

抽象工厂

举例,现在需要通过工厂来制造交通工具,如果是现代的工厂,制造的就是汽车,如果是古代的工厂,制造的就是马车, 我们可以先把工厂抽象出来,

public abstract class AbstractFactory {

    protected abstract Transportation createTransportation();

    protected abstract WritingInstrument createWritingInstrument();
}

交通工具也可以抽象出来

public abstract class Transportation {
    protected abstract void go();
}

对于马车和汽车来说,只需要继承这个 Transportation 类,实现对应的 go 方法即可,以汽车为例

public class Car extends Transportation {
    @Override
    protected void go() {
        System.out.println("car go");
    }
}

对于现代工厂还是古代工厂,只需要继承 AbstractFactory 这个抽象类,实现 createTransportation 方法即可,以现代工厂为例

public class ModernFactory extends AbstractFactory {

    @Override
    protected Transportation createTransportation() {
        return new Car();
    }

    @Override
    protected WritingInstrument createWritingInstrument() {
        return new Pen();
    }
}

主方法在调用的时候,只需要

public class Main {
    public static void main(String[] args) {
        AbstractFactory factory = new ModernFactory();
        factory.createTransportation().go();
    }
}

抽象工厂的UML图如下:

image

Java SE 8 提供了 Supplier 这个函数式接口,我们可以通过这个接口很方便的实现工厂类。更多 Java SE 8 新特性见:Java SE 8 新增特性

举例:

我们可以定义一个 MovableFactory ,里面的 create 方法,传入的是一个 Supplier 对象,你可以把所有 Movable 的子类实现传给这个参数,示例如下:

public class MovableFactory {
    public static Movable create(Supplier<? extends Movable> supplier) {
        return supplier.get();
    }

    public static void main(String[] args) {
        MovableFactory.create(Car::new).go();
        MovableFactory.create(() -> new Ship()).go();
    }
}

工厂模式应用举例

  1. JDK 中的 Calendar 类的 getInstance() 方法;

  2. LogBack 中 LoggerFactory.getLogger()方法;

  3. 在 Spring 中,所有工厂都是 BeanFactory 的子类。通过对 BeanFactory 的实现,我们可以从 Spring 的容器访问 Bean 。根据不同的策略调用 getBean() 方法,从而获得具体对象。

  4. Hibernate 换数据库只需换方言和驱动就可以切换不同数据库,也是利用了工厂模式。

UML 和 代码

UML 图

代码

更多

设计模式学习专栏

参考资料

标签:模式,public,工厂,go,new,设计模式,class
From: https://www.cnblogs.com/greyzeng/p/16867763.html

相关文章

  • day24 设计模式
    day24设计模式概述:设计模式是一种解决某个问题的固定模式(原理都是一样的),它不区分语言.常用的设计模式有23种,他分为三类(主要针对的是类和对象)设计......
  • XpSp3(未开启PAE模式)内存管理之系统PTE区域 上
    前言  几年前就已经看过wrk中关于内存管理和缓存管理的实现,由于当时对内核调试尚不熟悉,因此仅仅停留在代码层面。现在结合windbg操作,希望能有新的收获。毛德操的<window......
  • zabbix 主动模式和被动模式的区别
    目录zabbix主动模式和被动模式的区别zabbix主被动模式介绍将监控的主机由被动模式修改为主动模式配置zabbixagent监控主机的被动模式修改为主动模式查看主机链接的模板有......
  • JAVA 模板设计模式
    今天来介绍下一个我觉得蛮不错的设计模式(比较容易应用于业务场景),它就是---模板设计模式。OK,我们直接看代码:模板模式,那当然我们需要建一个模板先,建一个抽象类,VehicleControlM......
  • 23 种设计模式C++实现
    设计模式的分类总体来说设计模式分为三大类:创建型模式,共五种:​​单例模式​​、​​原型模式​​、​​工厂方法模式​​、​​抽象工厂模式​​、​​建造者模式​​。结构......
  • 设计模式(十八)桥接模式 C++
    桥接模式即将抽象部分与它的实现部分分离开来,使他们都可以独立变化。桥接模式将继承关系转化成关联关系,它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。桥......
  • JAVA 责任链设计模式
    这次介绍责任链模式,采用最普遍的请假例子来编码实现。先给列出个模拟的需求,一个人请假,调用一个接口,传入的参数是他请假的天数。然后,请假的天数---->如果小于2天,由直属领导......
  • 门面模式
    复习引入一、几种设计模式(1)创建型:工厂模式(简单工厂、抽象工厂)、单例模式、原型模式、建造者模式。​ 随着软件内部分工原来月明确,对象的创建和对象的使用分开也就成为......
  • 策略者模式
    策略者模式: 定义了算法组,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用的算法客户! 案例解析:  游戏中的不同的角色可以使用不同的武器来进行......
  • 注塑行业MES系统解决方案,打造数字化智能工厂 先达智控
    一直以来,生产信息管理系统和设备控制系统作为不同领域的系统在企业当中分别建设,它们作为两个独立的系统运行,二者之间不存在信息交流,然而在企业实际的运行过程中,管理者更希望......