《一天一个设计模式》----工厂方法模式(Factory Method)

简介: 《一天一个设计模式》----工厂方法模式(Factory Method)

一:模式动机


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


二:模式定义


工厂方法模式又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。

在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。


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


三:模式结构


工厂方法模式包含如下角色:


AbstractProduct: 抽象产品

concreteProcuct:具体产品

AbstractFactory:抽象工厂

ConcreteFactory:具体工厂


20210606195225821.png


四:代码实例


有四个角色,抽象工厂,具体工厂,抽象产品,具体产品。不再是由一个工厂类去实例化具体的产品,而是由抽象工厂的子类去实例化产品


1.抽象产品

public interface Bus {
    void run();
    void stop();
}

2.具体产品ConcreteProduct

实现接口

public class BusImpl1 implements Bus {
    @Override
    public void run() {
        System.out.println("BusImpl1 is running");
    }
    @Override
    public void stop() {
        System.out.println("BusImpl1 stop running");
    }
}
public class BusImpl2 implements Bus {
    @Override
    public void run() {
        System.out.println("BusImpl2 is running");
    }
    @Override
    public void stop() {
        System.out.println("BusImpl2 stop running");
    }
}

3.抽象工厂Factory

定义产品生成接口

/**
 * 抽象工厂
 */
public abstract class AbstractFactory {
    abstract public Bus create();
}

4.具体工厂ConcreteFactory

实现产品生成接口,生成具体产品角色对象

/**
 * 具体工厂
 */
public class BusImpl1Factory extends AbstractFactory {
    @Override
    public Bus create() {
        return new BusImpl1();
    }
}
/**
 * 具体工厂
 */
public class BusImpl2Factory extends AbstractFactory {
    @Override
    public Bus create() {
        return new BusImpl2();
    }
}

5.客户端:

public class Client1 {
    public static void main(String[] args) {
        // 由抽象工厂的子类去实例化产品
        AbstractFactory busImpl1Factory = new BusImpl1Factory();
        Bus busImpl1 = busImpl1Factory.create();
        busImpl1.run();
        AbstractFactory busImpl2Factory = new BusImpl2Factory();
        Bus busImpl2 = busImpl2Factory.create();
        busImpl2.stop();
    }
}

五:分析与总结


工厂方法模式又称为工厂模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。


具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品


工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。


在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。


工厂方法模式的主要 优点 是增加新的产品类时无须修改现有系统,并封装了产品对象的创建细节,系统具有良好的灵活性和可扩展性;


其 缺点 在于增加新产品的同时需要增加新的工厂,导致系统类的个数成对增加,在一定程度上增加了系统的复杂性。


工厂方法模式适用情况包括:


一个类不知道它所需要的对象的类;


一个类通过其子类来指定创建哪个对象;


将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定。


相关文章
|
1月前
|
设计模式 SQL 算法
设计模式了解哪些,模版模式
设计模式了解哪些,模版模式
22 0
|
1月前
|
设计模式 开发者
探讨常见设计模式 - 工厂方法模式的最佳实践和潜在的实施问题
【4月更文挑战第7天】工厂方法模式是创建型设计模式,提供了一种在不指定具体类情况下创建对象的方式。它定义创建对象的接口,允许子类决定实例化哪个类,从而解耦对象的创建和使用。最佳实践包括明确接口、封装创建逻辑、提供扩展点和避免过度使用。然而,过度工程、违反开闭原则、性能影响和依赖管理是可能的问题。通过权衡利弊并遵循最佳实践,工厂方法模式能在适当场景下提升代码灵活性和可扩展性。
|
28天前
|
设计模式 Java 数据库
小谈设计模式(2)—简单工厂模式
小谈设计模式(2)—简单工厂模式
|
9天前
|
设计模式 前端开发 Java
19:Web开发模式与MVC设计模式-Java Web
19:Web开发模式与MVC设计模式-Java Web
19 4
|
13天前
|
设计模式 消息中间件 Java
Java 设计模式:探索发布-订阅模式的原理与应用
【4月更文挑战第27天】发布-订阅模式是一种消息传递范式,被广泛用于构建松散耦合的系统。在 Java 中,这种模式允许多个对象监听和响应感兴趣的事件。
34 2
|
17天前
|
设计模式 存储 JavaScript
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
|
17天前
|
设计模式 Java Go
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
|
17天前
|
设计模式 测试技术 Go
[设计模式 Go实现] 创建型~工厂方法模式
[设计模式 Go实现] 创建型~工厂方法模式
|
18天前
|
设计模式
设计模式(二)工厂方法模式(Factory Method)
设计模式(二)工厂方法模式(Factory Method)
15 0
|
19天前
|
设计模式
设计模式(一)简单工厂模式
设计模式(一)简单工厂模式
14 0