java的设计模式之抽象工厂模式

抽象工厂模式(Avstract Factory)

在某些情况下,需要创建一系列相关或相互依赖的对象,这些对象属于一组相关的产品族。同时,系统需要保证这些产品族之间的一致性。如果直接在代码中创建这些对象,会使得代码与具体产品的细节紧密耦合,不利于后续的扩展和维护。

抽象工厂模式提供了一个接口,用于创建一系列相关或相互依赖的对象。通过使用抽象工厂接口及其具体实现,可以将对象的创建与客户端代码分离,从而实现系统的松耦合。抽象工厂模式涉及多个角色:

  • 抽象工厂 (Abstract Factory):声明了一组用于创建不同产品的抽象方法,具体的工厂类必须实现这些方法来创建具体的产品对象。
  • 具体工厂(Concrete Factory):实现抽象工厂接口,负责创建特定种类的产品对象。
  • 抽象产品(Abstract Product):定义了产品的通用接口,具体产品必须实现这个接口。
  • 具体产品(Concrete Product):实现抽象产品接口,是抽象工厂创建的实际对象。

抽象工厂模式的使用可以带来以下效果:

  • 产品族的一致性:抽象工厂确保创建的产品是一组相关的产品族,保证了这些产品之间的一致性。
  • 松耦合:客户端代码不需要直接依赖于具体产品,只需要通过抽象工厂接口创建产品,从而降低了代码的耦合度。
  • 可扩展性:增加新的产品族或茶农变得相对容易,只需要添加新的具体工厂和产品类即可,不需要修改现有的代码。
  • 限制:抽象工厂模式要求系统中的每个产品族都必须有一个对应的具体工厂,这可能增加了系统的复杂性。

抽象工厂模式适用于需要创建一系列相关产品并保证它们之间一致性的情况,例如图形界面库中的UI元素,不同操作系统下的界面组件等。通过使用抽象工厂模式,可以更好的管理和组织这些产品的创建过程。

代码实例:

复制代码
// 抽象产品接口:操作系统
interface OperatingSystem {
    void run();
}

// 具体产品:Windows操作系统
class WindowsOS implements OperatingSystem {
    @Override
    public void run() {
        System.out.println("Running Windows OS");
    }
}

// 具体产品:Linux操作系统
class LinuxOS implements OperatingSystem {
    @Override
    public void run() {
        System.out.println("Running Linux OS");
    }
}

// 抽象产品接口:应用程序
interface Application {
    void open();
}

// 具体产品:Word应用程序
class WordApplication implements Application {
    @Override
    public void open() {
        System.out.println("Opening Word Application");
    }
}

// 具体产品:Excel应用程序
class ExcelApplication implements Application {
    @Override
    public void open() {
        System.out.println("Opening Excel Application");
    }
}

// 抽象工厂接口
interface SoftwareFactory {
    OperatingSystem createOperatingSystem();
    Application createApplication();
}

// 具体工厂:Windows工厂
class WindowsFactory implements SoftwareFactory {
    @Override
    public OperatingSystem createOperatingSystem() {
        return new WindowsOS();
    }

    @Override
    public Application createApplication() {
        return new ExcelApplication();
    }
}

// 具体工厂:Linux工厂
class LinuxFactory implements SoftwareFactory {
    @Override
    public OperatingSystem createOperatingSystem() {
        return new LinuxOS();
    }

    @Override
    public Application createApplication() {
        return new WordApplication();
    }
}

// 在这个示例中,抽象工厂模式通过SoftwareFactory接口和其实现类来创建不同类型的操作系统和应用程序。
// 客户端代码可以根据需要选择不同的工厂实例来创建不同的产品组合。
public class Client {
    public static void main(String[] args) {
        SoftwareFactory windowsFactory = new WindowsFactory();
        OperatingSystem windowsOS = windowsFactory.createOperatingSystem();
        Application windowsApp = windowsFactory.createApplication();

        windowsOS.run();
        windowsApp.open();

        SoftwareFactory linuxFactory = new LinuxFactory();
        OperatingSystem linuxOS = linuxFactory.createOperatingSystem();
        Application linuxApp = linuxFactory.createApplication();

        linuxOS.run();
        linuxApp.open();
    }
}

抽象工厂模式理解起来比较复杂,我的理解是,有工厂和产品,工厂和产品都要做一个抽象父类,再实现抽象类的子类,在实际调用时可以用抽象类接受具体实例化的子类,再调用相关的产品。

相关推荐
Evand J4 分钟前
【PMSM例程4】PMSM电阻辨识与模型补偿EKF,MATLAB例程。附下载链接,包运行成功
开发语言·matlab·电机·ekf·卡尔曼·pmsm
王仔小奶5 分钟前
Rust 正在接管金融圈?深度拆解一份高薪 FinTech 岗位 JD
开发语言·金融·rust
小王C语言8 分钟前
Qt常用控件:多元素控件,纵向列表,表格控件,树状控件
开发语言·qt
fanruitian8 分钟前
python 可视化 panda seaborn matplotlib.pyplot
开发语言·python·matplotlib
jnrjian28 分钟前
delete file shell 让 AI 写脚本
服务器·开发语言
傅科摆 _ py42 分钟前
DP,贪心,堆和栈,二分力扣复习
开发语言·python·算法
kiracrimson1 小时前
栈与队列容器:适配器、deque 与 priority_queue
开发语言·c++·适配器模式
北冥you鱼1 小时前
Go 语言 CRUD 实战:从接口设计到真实业务场景
开发语言·后端·golang
Lichee201 小时前
招行Java 面试知识点梳理:Spring 事务、锁、线程池、集合
java·面试
YDS8291 小时前
Small Spring IOC篇:作用域和FactoryBean
java·后端·spring