抽象工厂模式

253 阅读2分钟

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

先看一下工厂模式

1. 工厂模式

定义一个用于创建对象的接口,让子类决定实例化那个类。工厂方法使一个类的实例化延迟到子类。

有2个接口,一个是工厂接口,一个是生产的产品接口

工厂A,工厂B都属于工厂接口具体的实现类

工厂A生产产品A

工厂B生产产品B

产品A和产品B都属于产品接口具体的实现类

如果想生产产品C,可以新增一个工厂C实现工厂接口,不用修改工厂接口内部的代码,符合开闭原则,对内修改关闭,对外修改开放。

可以参考下面的类图

工厂模式.png

image.png

public class FactoryPattern {
    public static void main(String[] args) {
        Factory factory = new HuaWeiFactory();
        Phone phone = factory.createPhone();
        phone.print();
    }
}

interface Phone {
    void print();
}

class iPhone implements Phone {

    @Override
    public void print() {
        System.out.print("iPhone");
    }
}

class HuaWeiPhone implements Phone {

    @Override
    public void print() {
        System.out.print("HuaWeiPhone");
    }
}

interface Factory {
    Phone createPhone();
}

class IPhoneFactory implements Factory {

    @Override
    public Phone createPhone() {
        return new iPhone();
    }
}

class HuaWeiFactory implements Factory {

    @Override
    public Phone createPhone() {
        return new HuaWeiPhone();
    }
}

2. 抽象工厂模式

工厂模式是一对一的关系,即一个工厂只能生产一类产品,抽象工厂模式打破了这种一对一的关系,可以是一对多的关系,即一个工厂可以生产多类产品。

抽象工厂模式只是工厂模式的一个扩展,抽象工厂模式如果只有一个产品体系就会退化成工厂模式

image.png

image.png

public class AbstractFactoryPattern {
    public static void main(String[] args) {
        SuperFactory factory = new SuperFactory();
        Phone phone = factory.createPhone("1");
        phone.print();
    }
}

interface Phone {
    void print();
}

class iPhone implements Phone {

    @Override
    public void print() {
        System.out.print("iPhone");
    }
}

class HuaWeiPhone implements Phone {

    @Override
    public void print() {
        System.out.print("HuaWeiPhone");
    }
}

interface Mask {
    void print();
}

class N95 implements Mask {

    @Override
    public void print() {
        System.out.print("N95");
    }
}

class KN95 implements Mask {

    @Override
    public void print() {
        System.out.print("KN95");
    }
}

interface AbstractFactory {
    Phone createPhone(String param);
    Mask createMask(String param);
}

class SuperFactory implements AbstractFactory {

    @Override
    public Phone createPhone(String param) {
        return new iPhone();
    }

    @Override
    public Mask createMask(String param) {
        return new N95();
    }
}