设计模式—抽象工厂模式

简介: 当看到new关键字的时候,就会想到具体,而业务代码中充斥着太多的new关键字,一旦有变化或扩展,就必须重对代码进行修改,通常这样修改过的代码更难以维护和更新,而且更容易犯错。

当看到new关键字的时候,就会想到具体,而业务代码中充斥着太多的new关键字,一旦有变化或扩展,就必须重对代码进行修改,通常这样修改过的代码更难以维护和更新,而且更容易犯错。

想想设计模式的SOLID原则

抽象不应该依赖细节;细节应该依赖抽象。针对接口编程,可以隔离以后系统可能发生的一大堆改变。为什么呢?通过多态,可以与任何新类实现该接口。

含义

  • 当需要定义一个产品家族的产品时,产品众多,需要一个大的接口,来组合所有的产品。
  • new关键字有一定的副作用,虽然new关键字是java的基础部分,使用new不可避免,但是使用工厂模式可以把new对象的过程收集起来。
  • 加入新的产品就必须要改变接口,这个将是一份庞大的工作。所以接口需要大一点
img_cc06e0397483d65e932bc368d74a9f7a.png
模式图

如果我们开发一个平台独立型的便携式软件。 这些平台可能是windows,linux,unix,也可能是数据库。如果我们不去按设计模式处理他们,将会看到到处都是#if #else的语句。创建对象的代码到处乱跑... 如果使用了工厂模式,则可以把创建对象的代码收集起来。
可以用制作汽车来对比。

img_76d6320bc79db8cca9d105ade318baab.png
模式图

案例

抽象工厂的目的是提供一个接口以便创建一个系列的相关对象,而无需指定精确的类。此模式可以在制造产业中找到相似的,一台器械不同的部分由不同的工厂来创建具体的东西。

创建CPU的产品家族

// class CPU
abstract class CPU {}

// class EmberCPU
class EmberCPU extends CPU {}

// class EnginolaCPU
class EnginolaCPU extends CPU {}

// class MMU
abstract class MMU {}

// class EmberMMU
class EmberMMU extends MMU {}

// class EnginolaMMU
class EnginolaMMU extends MMU {}

// class EmberFactory
class EmberToolkit extends AbstractFactory {
    @Override
    public CPU createCPU() {
        return new EmberCPU();
    }

    @Override
    public MMU createMMU() {
        return new EmberMMU();
    }
}

// class EnginolaFactory
class EnginolaToolkit extends AbstractFactory {
    @Override
    public CPU createCPU() {
        return new EnginolaCPU();
    }

    @Override
    public MMU createMMU() {
        return new EnginolaMMU();
    }
}

enum Architecture {
    ENGINOLA, EMBER
}

abstract class AbstractFactory {
    private static final EmberToolkit EMBER_TOOLKIT = new EmberToolkit();
    private static final EnginolaToolkit ENGINOLA_TOOLKIT = new EnginolaToolkit();

    // Returns a concrete factory object that is an instance of the
    // concrete factory class appropriate for the given architecture.
    static AbstractFactory getFactory(Architecture architecture) {
        AbstractFactory factory = null;
        switch (architecture) {
            case ENGINOLA:
                factory = ENGINOLA_TOOLKIT;
                break;
            case EMBER:
                factory = EMBER_TOOLKIT;
                break;
        }
        return factory;
    }

    public abstract CPU createCPU();

    public abstract MMU createMMU();
}

public class Client {
    public static void main(String[] args) {
        AbstractFactory factory = AbstractFactory.getFactory(Architecture.EMBER);
        CPU cpu = factory.createCPU();
    }
}

案例二

img_5fa6d23d9e89b44731912041c129e0aa.png
image.png
public interface IButton {
    void paint();
}

public interface IGUIFactory {
    public IButton createButton();
}

public class WinFactory implements IGUIFactory {
    @Override
    public IButton createButton() {
        return new WinButton();
    }
}

public class OSXFactory implements IGUIFactory {
    @Override
    public IButton createButton() {
        return new OSXButton();
    }
}

public class WinButton implements IButton {
    @Override
    public void paint() {
        System.out.println("WinButton");
    }
}

public class OSXButton implements IButton {
    @Override
    public void paint() {
        System.out.println("OSXButton");
    }
}

public class Main {

    public static void main(final String[] arguments) throws Exception {
        IGUIFactory factory = null;
        
        final String appearance = randomAppearance();   // Current operating system

        if (appearance.equals("OSX")) {
            factory = new OSXFactory();
        } else if(appearance.equals("Windows")) {
            factory = new WinFactory();
        } else {
            throw new Exception("No such operating system");
        }
        
        final IButton button = factory.createButton();

        button.paint();
    }
    
    /**
     * This is just for the sake of testing this program, and doesn't have to do
     * with Abstract Factory pattern.
     * @return
     */
    public static String randomAppearance() {
        final String[] appearanceArray = new String[3];

        appearanceArray[0] = "OSX";
        appearanceArray[1] = "Windows";
        appearanceArray[2] = "error";
        final java.util.Random random = new java.util.Random();

        final int randomNumber = random.nextInt(3);

        return appearanceArray[randomNumber];
    }
}

最后

整理了一下抽象工厂方法的定义与通常显现的形式,想要探索其中更多的奥秘,还要亲自去实践。

相关文章
|
5月前
|
设计模式 PHP
php设计模式--抽象工厂模式(二)
php设计模式--抽象工厂模式(二)
29 0
|
4月前
|
设计模式
**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合
【6月更文挑战第23天】**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合。工厂模式专注于单个对象,通过具体工厂创建具体产品,适用于简单对象创建;抽象工厂则关注一系列相关产品,提供创建一族对象的接口,适用于处理多个不兼容产品族。选择模式基于问题域的复杂性,单个产品需求时用工厂模式,多产品族时用抽象工厂模式。
30 5
|
5月前
|
设计模式 Java
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
|
21天前
|
设计模式 Java
Java设计模式-抽象工厂模式(5)
Java设计模式-抽象工厂模式(5)
|
5月前
|
设计模式 Java
Java一分钟之-设计模式:工厂模式与抽象工厂模式
【5月更文挑战第17天】本文探讨了软件工程中的两种创建型设计模式——工厂模式和抽象工厂模式。工厂模式提供了一个创建对象的接口,延迟实例化到子类决定。过度使用或违反单一职责原则可能导致问题。代码示例展示了如何创建形状的工厂。抽象工厂模式则用于创建一系列相关对象,而不指定具体类,但添加新产品可能需修改现有工厂。代码示例展示了创建颜色和形状的工厂。根据需求选择模式,注意灵活性和耦合度。理解并恰当运用这些模式能提升代码质量。
57 2
|
5月前
|
设计模式 Java
【设计模式系列笔记】抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是一种设计模式,属于创建型模式之一。它提供了一种方式来创建一系列相关或相互依赖的对象,而无需指定它们具体的类。抽象工厂模式通过引入抽象的工厂接口,使得客户端代码可以使用抽象的接口来创建一组相关的产品,而不关心这些产品的具体实现。
189 4
|
2月前
|
设计模式 Java
Java 设计模式之谜:工厂模式与抽象工厂模式究竟隐藏着怎样的神奇力量?
【8月更文挑战第30天】在Java编程中,设计模式为常见问题提供了高效解决方案。工厂模式与抽象工厂模式是常用的对象创建型设计模式,能显著提升代码的灵活性、可维护性和可扩展性。工厂模式通过定义创建对象的接口让子类决定实例化哪个类;而抽象工厂模式则进一步提供了一个创建一系列相关或相互依赖对象的接口,无需指定具体类。这种方式使得系统更易于扩展和维护。
35 1
|
2月前
|
设计模式 XML 存储
【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)
文章详细介绍了抽象工厂模式,这是一种创建型设计模式,用于提供一个接口以创建一系列相关或相互依赖的对象,而不指定它们具体的类。通过代码示例和结构图,文章展示了抽象工厂模式的动机、定义、结构、优点、缺点以及适用场景,并探讨了如何通过配置文件和反射机制实现工厂的动态创建。
【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)
|
2月前
|
设计模式 Java C语言
设计模式-----------工厂模式之抽象工厂模式(创建型)
抽象工厂模式是一种创建型设计模式,它提供了一个接口用于创建一系列相关或相互依赖的对象,而无需指定具体类,从而增强了程序的可扩展性并确保客户端只使用同一产品族的产品。
设计模式-----------工厂模式之抽象工厂模式(创建型)
|
2月前
|
设计模式 存储 XML
[设计模式]创建型模式-抽象工厂模式
[设计模式]创建型模式-抽象工厂模式