设计模式之工厂模式

1. 工厂模式概述

工厂模式是一种创建型设计模式,用于创建对象的方式和过程,以便将对象的创建与其使用分离开来。这种模式提供了一种通用的接口,以创建对象,但具体的对象创建过程由实现工厂接口的具体子类决定。

工厂模式通常包括以下几种变体:

  • 简单工厂模式:在这个模式中,有一个工厂类,负责根据客户的需求创建对象。客户不需要了解对象的具体创建过程,只需告诉工厂需要哪种类型的对象。

  • 工厂方法模式:工厂方法模式引入了抽象工厂类,其中包含一个或多个抽象方法,用于创建对象。具体的工厂子类实现这些抽象方法来创建具体的对象。

  • 抽象工厂模式:抽象工厂模式提供了一组相关的工厂类,每个工厂类可以创建一组相关的对象。这种模式有多个抽象方法,每个方法用于创建不同种类的对象。

工厂模式有助于降低对象的创建和使用之间的耦合度,使代码更容易维护和扩展。根据需要,您可以选择使用简单工厂、工厂方法或抽象工厂模式,以满足不同的设计需求。

2. Java实现工厂模式

2.1简单工厂模式的示例:

java 复制代码
// 抽象产品
interface Product {
    void create();
}

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

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

// 简单工厂
class SimpleFactory {
    public Product createProduct(String productType) {
        if ("A".equals(productType)) {
            return new ConcreteProductA();
        } else if ("B".equals(productType)) {
            return new ConcreteProductB();
        } else {
            throw new IllegalArgumentException("Invalid product type.");
        }
    }
}

public class FactoryPatternExample {
    public static void main(String[] args) {
        SimpleFactory factory = new SimpleFactory();
        Product productA = factory.createProduct("A");
        productA.create();

        Product productB = factory.createProduct("B");
        productB.create();
    }
}

在这个示例中,SimpleFactory 负责根据客户的请求创建不同类型的产品(Product)。客户只需提供产品的类型,而不需要了解产品的具体创建过程。

2.2 工厂方法模式:创建不同类型的电视

工厂方法模式是创建型设计模式,它定义了一个创建对象的接口,但将具体的对象创建过程延迟到子类。以下是一个使用Java的工厂方法模式的示例,结合实际场景:创建不同类型的电视机。

首先,定义一个抽象产品接口 TV:

java 复制代码
public interface TV {
    void play();
}

然后,创建两个具体产品类,分别实现 TV 接口:

java 复制代码
public class SamsungTV implements TV {
    public void play() {
        System.out.println("Samsung TV is playing.");
    }
}

public class SonyTV implements TV {
    public void play() {
        System.out.println("Sony TV is playing.");
    }
}

接下来,定义一个抽象工厂接口 TVFactory,它包含一个用于创建 TV 对象的抽象方法:

java 复制代码
public interface TVFactory {
    TV createTV();
}

创建两个具体工厂类,分别实现 TVFactory 接口:

java 复制代码
public class SamsungTVFactory implements TVFactory {
    public TV createTV() {
        return new SamsungTV();
    }
}

public class SonyTVFactory implements TVFactory {
    public TV createTV() {
        return new SonyTV();
    }
}

现在,您可以使用工厂方法模式来创建不同品牌的电视机,而不需要直接调用具体的产品类。示例:

java 复制代码
public class FactoryMethodExample {
    public static void main(String[] args) {
        TVFactory samsungFactory = new SamsungTVFactory();
        TV samsungTV = samsungFactory.createTV();
        samsungTV.play();

        TVFactory sonyFactory = new SonyTVFactory();
        TV sonyTV = sonyFactory.createTV();
        sonyTV.play();
    }
}

在这个示例中,TVFactory 接口是工厂方法的核心,每个具体工厂类负责创建特定品牌的电视机。这种模式使得客户端代码可以轻松切换不同品牌的电视机,同时保持了高层代码与具体产品的解耦。

2.3 抽象工厂模式:创建不同操作系统下的应用程序界面

抽象工厂模式是一种创建型设计模式,用于创建一组相关或依赖对象的家族,而无需指定其具体类。以下是一个使用Java的抽象工厂模式的示例,结合实际场景:创建不同操作系统下的应用程序界面。

首先,定义两个抽象产品接口 Button 和 Checkbox:

java 复制代码
public interface Button {
    void render();
}

public interface Checkbox {
    void render();
}

然后,创建不同操作系统下的具体产品类,分别实现 Button 和 Checkbox 接口:

java 复制代码
public class WindowsButton implements Button {
    public void render() {
        System.out.println("Render a Windows button");
    }
}

public class WindowsCheckbox implements Checkbox {
    public void render() {
        System.out.println("Render a Windows checkbox");
    }
}

public class MacOSButton implements Button {
    public void render() {
        System.out.println("Render a macOS button");
    }
}

public class MacOSCheckbox implements Checkbox {
    public void render() {
        System.out.println("Render a macOS checkbox");
    }
}

接下来,定义两个抽象工厂接口 GUIFactory,它包含用于创建 Button 和 Checkbox 对象的抽象方法:

java 复制代码
public interface GUIFactory {
    Button createButton();
    Checkbox createCheckbox();
}

创建两个具体工厂类,分别实现 GUIFactory 接口,每个工厂类负责创建特定操作系统下的界面元素:

java 复制代码
public class WindowsFactory implements GUIFactory {
    public Button createButton() {
        return new WindowsButton();
    }

    public Checkbox createCheckbox() {
        return new WindowsCheckbox();
    }
}

public class MacOSFactory implements GUIFactory {
    public Button createButton() {
        return new MacOSButton();
    }

    public Checkbox createCheckbox() {
        return new MacOSCheckbox();
    }
}

现在,您可以使用抽象工厂模式来创建操作系统相关的界面元素,而不需要直接调用具体的产品类。示例:

java 复制代码
public class AbstractFactoryExample {
    public static void main(String[] args) {
        GUIFactory factory;
        String os = "macOS"; // 切换操作系统
        if (os.equalsIgnoreCase("Windows")) {
            factory = new WindowsFactory();
        } else if (os.equalsIgnoreCase("macOS")) {
            factory = new MacOSFactory();
        } else {
            throw new UnsupportedOperationException("Unsupported OS: " + os);
        }

        Button button = factory.createButton();
        Checkbox checkbox = factory.createCheckbox();

        button.render();
        checkbox.render();
    }
}

这个示例中,GUIFactory 接口是抽象工厂的核心,每个具体工厂类负责创建特定操作系统下的界面元素。抽象工厂模式允许客户端代码在不改变的情况下创建不同操作系统下的界面元素,同时保持了高层代码与具体产品的解耦。

相关推荐
wear工程师2 分钟前
线程池里的异常去哪了?execute 和 submit 不是一回事
java
孔明click339 分钟前
别人绕过我的网关直接调用资源服务怎么办?使用 Sa-Token 解决:网关转发鉴权、RPC调用鉴权
java·sa-token·springboot·权限·权限认证
吴声子夜歌12 分钟前
Java面试——设计模式(一)
java·设计模式·面试
半亩码田21 分钟前
C#转Python第3.6篇:Python 的 @property 比 C# 的 get/set 更灵活
java·python·c#
老郑聊AI业财智造35 分钟前
Spring AI 技术架构与源码分析
java·人工智能·后端·spring·架构·软件工程
程序员与背包客_CoderZ36 分钟前
高性能分布式KV存储引擎RocksDB入门与C/C++编码实战
c语言·开发语言·数据库·c++·分布式·分布式数据库·rocksdb
省长41 分钟前
别人绕过我的网关直接调用资源服务怎么办?使用 Sa-Token 解决:网关转发鉴权、RPC调用鉴权
java·后端·开源
MetaLite42 分钟前
SpringBoot异常处理-到底该转换还是继续抛-入口层与调用层不能一刀切
java·spring boot·后端
钱栈up1 小时前
Mac 开发机一键发版不用切环境:我这样改造了团队的后端部署脚本Maven编译卡住20分钟?我靠两步定位到2处隐蔽编译错误
开发语言·python·macos
william_yangshun1 小时前
【大模型部署实战】kimi-k3-in-c 中文版:用 176KB 纯 C99 引擎在 CPU 上跑 Kimi K3 上手指南
c语言·开发语言