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

设计模式,学习,工厂,模式 · 浏览次数 : 321

小编点评

**工厂模式学习(三):工厂模式** **什么是工厂模式?** 工厂模式是一种创建对象的模式,它将创建不同的对象,并根据对象的类型进行选择。工厂模式有以下三种类型: * **简单工厂:**创建单个对象的工厂。 * **工厂方法:**创建多个对象的工厂。 * **抽象工厂:**定义一个接口,并实现不同的工厂实现。 **简单工厂** 简单工厂创建单个对象的工厂。 ```java 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(); } } } ``` **工厂方法** 工厂方法创建多个对象的工厂。 ```java public class FactoryMethodDemo { public static void main(String[] args) { MouseFactory mf = new HPMouseFactory(); Mouse mouse = mf.createMouse(); mouse.sayHi(); } } ``` **抽象工厂** 抽象工厂定义一个接口,并实现不同的工厂实现。 ```java public abstract class AbstractFactory { protected abstract Transportation createTransportation(); protected abstract WritingInstrument createWritingInstrument(); } ``` **工厂模式应用** 工厂模式在以下场景中非常有用: * 创建不同的对象,例如创建不同类型的鼠标、汽车、飞机等。 * 不同的工厂可以处理不同的对象创建请求。 * 避免代码重复,并简化创建对象的流程。 **优点** * 代码可读性增强。 * 减少代码重复。 * 改善代码可维护性。 **缺点** * 依赖依赖注入。 * 难以确定工厂的具体类型。 * 必须使用特定的工厂实现类。

正文

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

作者: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 图

代码

更多

设计模式学习专栏

参考资料

与设计模式学习(三):工厂模式相似的内容:

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

设计模式学习(三):工厂模式 作者:Grey 原文地址: 博客园:设计模式学习(三):工厂模式 CSDN:设计模式学习(三):工厂模式 工厂模式 工厂模式是创建型模式,工厂模式分为:简单工厂,工厂方法和抽象工厂三种类型。 简单工厂 这个模式很简单,比如我们需要制造不同类型的鼠标,我们只需要创建一个鼠

设计模式学习(二)工厂模式——抽象工厂模式+注册表

目录前言使用简单工厂改进使用注册表改进参考文章 前言 在上一篇文章中我们提到了抽象工厂模式初版代码的一些缺点:①客户端违反开闭原则②提供方违反开闭原则。本文将针对这两点进行讨论 使用简单工厂改进 对于缺点①,我们可以使用简单工厂的思路来改进抽象工厂的初版代码。对于上一篇文章中的例子,我们去除Came

设计模式学习(二)工厂模式——抽象工厂模式

目录背景抽象工厂模式优点与缺点参考文章 背景 现在我需要开发一个相机操作模块,它可能在Windows下运行,也可能在Linux下运行。由于在厂家提供的SDK中,Windows下的SDK和Linux下的SDK是有区别的,因此对于一个品牌的相机,我们要创建两个类去封装这两个不同平台下的API。 我们先使

设计模式学习(二)工厂模式——工厂方法模式+注册表

目录工厂方法模式的瑕疵注册表 工厂方法模式的瑕疵 在前一篇笔记中我们介绍了工厂方法模式,示例的类图如下: 考虑一种情况:现在要在程序运行时,根据外部资源,动态的实例化对象。也就是说在编译期我们无法知道要实例化的对象的类型。因此在实例化的过程中,就需要加以判断。 例如,在我的例子中,要根据连接到主机的

Spring框架中的设计模式(重点学习!!!)

# Spring中的设计模式 Spring框架中用到的设计模式有很多,以下是一些常见的设计模式: 1. 依赖注入(DI)和控制反转(IoC):这是Spring框架最核心的设计模式,它允许开发人员将对象之间的依赖关系从代码中抽离出来,由Spring容器负责管理和注入对象之间的依赖关系。 2. 工厂模式

设计模式之抽象工厂模式(学习笔记)

定义 抽象工厂模式是一种创建型设计模式,它提供一个接口,用于创建一系列相关或依赖的对象,而无需指定它们的具体类。抽象工厂模式将对象的创建过程抽象化,允许子类通过实现具体工厂类来定制对象的创建。 为什么使用抽象工厂模式 产品族的一致性 抽象工厂模式确保同一产品族中的对象之间的一致性。 部分遵循开闭原则

设计模式之简单工厂模式(学习笔记)

定义 简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它定义一个用于创建对象的接口,但由一个单独的类来实现实际创建的工作。简单工厂模式通过在一个类中集中管理对象的创建过程,可以减少客户端与具体类之间的耦合,使得代码结构更加清晰和易于维护。通过专门定义一个类来负责创建

设计模式之工厂模式(学习笔记)

定义 工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类来决定实例化哪一个类。工厂方法使得类的实例化延迟到子类,这样可以让客户端在不需要知道具体类的情况下创建对象。工厂方法模式通过使用继承和多态性,允许子类来控制对象的创建方式,能够更好地应对对象创建的复杂性和变化性。 为什么

【23种设计模式】工厂方法模式(二)

## 前言 在讲述之工厂方法模式前,我们来先了解简单工厂模式,简单工厂模式是最简单的设计模式之一,它虽然不属于GoF的23种设计模式,但是应用也较为频繁,同时它也是学习其他创建型模式的基础。下面我们来先了解下简单工厂模式,然后针对它的缺点来引出工厂方法模式。 ## 简单工厂模式定义 **简单工厂模式

设计模式-C#实现简单工厂模式

前言 上一篇文章写了如何使用RabbitMQ做个简单的发送邮件项目,然后评论也是比较多,也是准备去学习一下如何确保RabbitMQ的消息可靠性,但是由于时间原因,先来说说设计模式中的简单工厂模式吧! 在了解简单工厂模式之前,我们要知道C#是一款面向对象的高级程序语言。它有3大特性,封装、继承、多态。