首页 > 其他分享 >Factory Pattern —— Creational Class

Factory Pattern —— Creational Class

时间:2023-08-29 18:23:54浏览次数:28  
标签:Pattern Factory 工厂 抽象 产品 创建 具体 public Creational

core

工厂模式(Factory Pattern)是一种创建型设计模式,用于创建对象而不暴露对象创建的逻辑。它将对象的实例化过程封装在一个工厂类中,客户端通过调用工厂类的方法来创建对象,从而实现了解耦和灵活性。

工厂模式的核心思想是将对象的创建与使用分离。客户端不直接实例化对象,而是通过调用工厂类的方法来获取对象实例。工厂类根据客户端的需求,决定实例化哪个具体对象,并将其返回给客户端。

三种工厂模式的识别

简单工厂模式工厂方法模式抽象工厂模式都属于创建型设计模式,用于封装对象的创建过程(相同点),但它们之间有明显的区别。

不同点:

  • 简单工厂模式(Simple Factory Pattern):
    简单工厂模式通过一个工厂类来创建产品对象,客户端通过调用工厂类的静态方法或实例方法来获取对象实例。
    工厂类负责根据客户端的需求,决定实例化哪个具体产品类。
    简单工厂模式的主要特点是工厂类集中了对象的创建逻辑,客户端通过工厂类来创建产品对象,而无需直接实例化具体产品类。但是,当需求变化时,需要修改工厂类的代码。

  • 工厂方法模式(Factory Method Pattern):
    工厂方法模式将对象的创建延迟到子类中,每个具体产品类都有对应的工厂类。
    抽象工厂类定义了创建产品对象的抽象方法,每个具体工厂类实现了抽象工厂类,负责创建具体产品的实例。
    客户端通过调用具体工厂类的方法来创建产品对象。客户端可以通过扩展抽象工厂类和具体工厂类来创建新的产品。

  • 抽象工厂模式(Abstract Factory Pattern):
    抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口,而无需指定具体类。
    抽象工厂模式包括抽象工厂类、具体工厂类、抽象产品类和具体产品类。
    抽象工厂类定义了一组创建产品对象的抽象方法,每个具体工厂类实现了抽象工厂类,负责创建一组相关的具体产品。
    客户端通过调用具体工厂类的方法来创建一组相关的产品对象。

总结:
简单工厂模式适用于创建单一类型的产品,通过一个工厂类来创建产品对象。
工厂方法模式适用于创建一类产品,每个具体产品都有对应的工厂类,通过扩展工厂类来创建新的产品。
抽象工厂模式适用于创建一组相关的产品,每个具体工厂类负责创建一组相关的产品对象。

选择使用哪种模式取决于具体需求和设计目标:

  • 简单工厂模式简单易用,但对于复杂的产品结构不够灵活;
  • 工厂方法模式适用于需要灵活扩展产品类的情况;
  • 抽象工厂模式适用于需要创建一组相关产品 并保持一致性的情况。(抽象工厂模式适用于一组相关的产品对象的创建,如果产品对象之间没有相关性或依赖关系,请考虑使用工厂方法模式。)

Simple Factory Pattern

下面是一个简单的示例代码,说明了简单工厂模式的基本结构:

// 产品接口
interface Product {
    void operation();
}

// 具体产品A
class ConcreteProductA implements Product {
    public void operation() {
        System.out.println("ConcreteProductA operation");
    }
}

// 具体产品B
class ConcreteProductB implements Product {
    public void operation() {
        System.out.println("ConcreteProductB operation");
    }
}

// 工厂类
class Factory {
    public Product createProduct(String type) {
        if (type.equals("A")) {
            return new ConcreteProductA();
        } else if (type.equals("B")) {
            return new ConcreteProductB();
        }
        return null;
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Factory factory = new Factory();
        
        // 创建具体产品A
        Product productA = factory.createProduct("A");
        productA.operation();
        
        // 创建具体产品B
        Product productB = factory.createProduct("B");
        productB.operation();
    }
}

在上面的示例中,Product 是产品接口,定义了产品的操作方法。ConcreteProductA 和 ConcreteProductB 是具体产品类,实现了产品接口,并定义了各自的操作方法。Factory 是工厂类,负责创建产品对象的方法。客户端通过调用工厂类的方法来创建具体产品的实例,并调用其操作方法。

通过使用工厂模式,客户端可以通过工厂类来创建具体产品的实例,而无需直接依赖具体产品类。这样可以实现代码的解耦和灵活性,使得系统更易于扩展和维护。

Factory Method Pattern

下面是一个简单的示例代码,说明了工厂方法模式的基本结构:

// 抽象产品
interface Product {
    void operation();
}

// 具体产品A
class ConcreteProductA implements Product {
    public void operation() {
        System.out.println("ConcreteProductA operation");
    }
}

// 具体产品B
class ConcreteProductB implements Product {
    public void operation() {
        System.out.println("ConcreteProductB operation");
    }
}

// 抽象工厂
interface Factory {
    Product createProduct();
}

// 具体工厂A
class ConcreteFactoryA implements Factory {
    public Product createProduct() {
        return new ConcreteProductA();
    }
}

// 具体工厂B
class ConcreteFactoryB implements Factory {
    public Product createProduct() {
        return new ConcreteProductB();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Factory factoryA = new ConcreteFactoryA();
        Product productA = factoryA.createProduct();
        productA.operation();

        Factory factoryB = new ConcreteFactoryB();
        Product productB = factoryB.createProduct();
        productB.operation();
    }
}

在上面的示例中,Product 是抽象产品接口,定义了产品的操作方法。ConcreteProductA 和 ConcreteProductB 是具体产品类,实现了产品接口,并定义了各自的操作方法。Factory 是抽象工厂接口,定义了创建产品对象的抽象方法。ConcreteFactoryA 和 ConcreteFactoryB 是具体工厂类,实现了抽象工厂接口,负责创建具体产品的实例。

客户端通过调用具体工厂类的方法来创建具体产品的实例,并调用其操作方法。通过使用工厂方法模式,客户端可以通过工厂类来创建产品对象,而无需直接依赖具体产品类。这样可以实现代码的解耦和灵活性,使得系统更易于扩展和维护。

Abstract Factory Pattern

一个常见的实际应用抽象工厂模式的例子是图形用户界面(GUI)库。假设我们正在开发一个跨平台的GUI库,需要支持不同操作系统(如Windows、macOS和Linux)下的窗口和按钮。

在这种情况下,可以使用抽象工厂模式来创建一组相关的产品对象,包括窗口和按钮。首先,定义抽象产品接口:

// 抽象窗口产品
interface Window {
    void render();
}

// 抽象按钮产品
interface Button {
    void click();
}

然后,实现具体的窗口和按钮产品类,每个操作系统对应一个具体产品类:

// Windows窗口产品
class WindowsWindow implements Window {
    public void render() {
        System.out.println("Render Windows window");
    }
}

// Windows按钮产品
class WindowsButton implements Button {
    public void click() {
        System.out.println("Click Windows button");
    }
}

//----------------------------------------------------------
// macOS窗口产品
class MacOSWindow implements Window {
    public void render() {
        System.out.println("Render macOS window");
    }
}

// macOS按钮产品
class MacOSButton implements Button {
    public void click() {
        System.out.println("Click macOS button");
    }
}

//----------------------------------------------------------
// Linux窗口产品
class LinuxWindow implements Window {
    public void render() {
        System.out.println("Render Linux window");
    }
}

// Linux按钮产品
class LinuxButton implements Button {
    public void click() {
        System.out.println("Click Linux button");
    }
}

接下来,定义抽象工厂接口来创建窗口和按钮:

// 抽象GUI工厂
interface GUIFactory {
    Window createWindow();
    Button createButton();
}

然后,实现具体的GUI工厂类,每个操作系统对应一个具体工厂类:

// Windows GUI工厂
class WindowsGUIFactory implements GUIFactory {
    public Window createWindow() {
        return new WindowsWindow();
    }
    public Button createButton() {
        return new WindowsButton();
    }
}

// macOS GUI工厂
class MacOSGUIFactory implements GUIFactory {
    public Window createWindow() {
        return new MacOSWindow();
    }
    public Button createButton() {
        return new MacOSButton();
    }
}

// Linux GUI工厂
class LinuxGUIFactory implements GUIFactory {
    public Window createWindow() {
        return new LinuxWindow();
    }
    public Button createButton() {
        return new LinuxButton();
    }
}

现在,客户端可以通过抽象工厂来创建特定操作系统下的窗口和按钮,并使用它们:

public class Client {
    public static void main(String[] args) {
        // 创建Windows风格的GUI
        GUIFactory windowsFactory = new WindowsGUIFactory();
        Window windowsWindow = windowsFactory.createWindow();
        Button windowsButton = windowsFactory.createButton();
        windowsWindow.render();
        windowsButton.click();

        // 创建macOS风格的GUI
        GUIFactory macosFactory = new MacOSGUIFactory();
        Window macosWindow = macosFactory.createWindow();
        Button macosButton = macosFactory.createButton();
        macosWindow.render();
        macosButton.click();

        // 创建Linux风格的GUI
        GUIFactory linuxFactory = new LinuxGUIFactory();
        Window linuxWindow = linuxFactory.createWindow();
        Button linuxButton = linuxFactory.createButton();
        linuxWindow.render();
        linuxButton.click();
    }
}

通过使用抽象工厂模式,我们可以轻松地扩展GUI库以支持新的操作系统,只需实现新的具体产品和具体工厂类即可,而不需要修改现有的客户端代码。这样,不同操作系统下的窗口和按钮将保持一致性,并且客户端无需关心具体产品的创建过程,只需使用抽象工厂接口来创建产品对象。

标签:Pattern,Factory,工厂,抽象,产品,创建,具体,public,Creational
From: https://www.cnblogs.com/mysticbinary/p/17648789.html

相关文章

  • 20230626 java.util.regex.Pattern
    介绍java.util.regex.PatternpublicfinalclassPatternimplementsjava.io.Serializable正则表达式的编译表示API常量flagUNIX_LINES启用UNIX行模式在多行模式中匹配^和$时,只有\n被识别成行终止符CASE_INSENSITIVE不区分大小写匹配字符时忽略字母的......
  • 设计模式之Factory模式
    在面向对象系统设计中经常可以遇到以下的两类问题:1)为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口。这样我们可以通过声明一个指向基类的指针来指向实际的子类实现,达到了多态的目的。这里很容易出现的一个问题n多的子类继承自抽象......
  • Spring3中替换默认拦截器的方法BeanFactoryPostProcessor
    由于Spring默认的静态资源处理器不能满足需求,需要做一些自己的处理,但mvc:resources的标签又挺好用的,不想每次配置静态资源目录的时候,还要特殊指定处理器,也不想修改任何配置代码,于是找到了使用BeanFactoryPostProcessor的方法 实现代码如下:importorg.springframework.beans.Beans......
  • Azure Data Factory(六)数据集类型为Dataverse的Link测试
    一,引言之前有讲过AzureDataFactory的CopyData的操作,演示了将BlobStorage1的数据通过AzureDataFactory复制到BlobStorage2中,今天我们玩一个不一样的,AzureDataverse-》AzureDataverse。开始今天的内容之前,我们先了解一下什么是AzureDataverse?Azur......
  • Visitor Pattern-访问者模式
    C#中的访问者模式(VisitorPattern)是一种行为型设计模式,它将数据结构和数据操作分离,使得可以在不修改数据结构的前提下定义新的操作。访问者模式的核心思想是将数据结构和数据操作解耦,将数据操作封装到独立的访问者类中。数据结构定义一组元素,每个元素接受访问者的访问并调用相应......
  • Strategy Pattern-策略模式
    C#中的策略模式(StrategyPattern)是一种行为型设计模式,它可以让你定义一族算法,并将每个算法封装起来,使它们可以相互替换,从而使得算法的变化独立于使用算法的客户端。策略模式的核心思想是将算法的定义和使用分离,将不同的算法封装到独立的策略类中。这样,客户端可以根据需求从不同的......
  • StatePattern-状态模式
    C#中的状态模式是一种行为型设计模式,它允许对象在其内部状态发生改变时改变其行为。状态模式的核心思想是将对象的行为封装在不同的状态类中,对象根据当前状态的不同而执行不同的行为。在C#中,实现状态模式通常需要以下几个参与者:状态接口(StateInterface):定义了表示不同状态的方法......
  • SAP ABAP 模式(Pattern)、模板的创建与调用
    1.代码模板2.模式(Pattern) 调用3.标准模式,一些内置固定格式代码的填充  ......
  • IteratorPattern-迭代器模式
    在C#中,迭代器模式(IteratorPattern)是一种行为型设计模式,它提供了一种方法来顺序访问一个聚合对象中的各个元素,而无需暴露聚合对象的内部表示。迭代器模式有以下几个关键角色:Iterator(迭代器):定义访问和遍历元素的接口。ConcreteIterator(具体迭代器):实现迭代器接口,实现对聚合对象的......
  • [Unity]UnityFactory.factory.BuildArmatureComponent空引用异常怎么办
    最近做面试项目,第一次接触DragonBones,尝试在代码中创建ArmatureComponent,armatureComponent=UnityFactory.factory.BuildArmatureComponent(clothesName);Assert.IsNotNull(armatureComponent);然后每次都是BuildArmatureComponent抛空引用异常,连Assert都碰不到,就算......