设计模式之创建型模式---工厂模式-抽象工厂

如前面所说,工厂方法模式只考虑生产同种等级的产品,比如造车的工厂就只是造车,生产手机的工厂就只是生产手机,但是在我们的现实生活中,许多工厂是综合性的工厂,比如造车的工厂也能造手机。为啥这么设计呢?用工厂方法不是更好吗,想造手机,再建一个造手机的工厂不就行了吗?用毛爷爷的话说,理论上行得通,但实际上不可行,因为现在的很多公司都是综合性的公司,大公司会生产各种各样的产品,要是每种产品就建一个工厂,那么地球上的土地就这么点,哪里够用呀,所以综合性工厂可以解决这个问题。这里我们以造车的例子为基础,为工厂新增一个造手机的功能。类图如下:
在这里插入图片描述

抽象工厂模式代码实现

基于工厂方法的例子,我们新增一个产品手机,首先定义手机的公共接口:

public interface IPhone {
    // 刷上颜色
    void printColor();

    // 安装系统
    void installOS();
}

创建手机A

public class PhoneA implements IPhone{
    private String color;
    private String systemOs;
    @Override
    public void printColor() {
        System.out.println("粉刷手机颜色为红色");
        color = "RED";

    }

    @Override
    public void installOS() {
        System.out.println("安装手机的操作系统为Android系统");
        systemOs = "Android";
    }

    @Override
    public String toString() {
        return "PhoneA{" +
                "color='" + color + '\'' +
                ", systemOs='" + systemOs + '\'' +
                '}';
    }
}

创建手机B:

public class PhoneB implements IPhone{
    private String color;
    private String systemOs;
    @Override
    public void printColor() {
        System.out.println("粉刷手机颜色为蓝色");
        color = "BLUE";

    }

    @Override
    public void installOS() {
        System.out.println("安装手机的操作系统为IOS系统");
        systemOs = "IOS";
    }

    @Override
    public String toString() {
        return "PhoneB{" +
                "color='" + color + '\'' +
                ", systemOs='" + systemOs + '\'' +
                '}';
    }
}

然后我们定义我们要建的综合性工厂的标准接口

public interface IAbstractFactory {
    ICar buildCar();
    IPhone buildPhone();
}

新建两个综合性工厂,A和B,分别生产A品牌的产品和B品牌的产品。

// 生产A品牌的产品
public class AFactory implements IAbstractFactory {
    private ICar mCarA =new  CarA();
    private IPhone mPhoneA = new PhoneA();
    @Override
    public ICar buildCar() {
        mCarA.printColor();
        mCarA.installEngine();
        mCarA.installWheels();
        mCarA.installSystem();
        return mCarA;
    }

    @Override
    public IPhone buildPhone() {
        mPhoneA.printColor();
        mPhoneA.installOS();
        return mPhoneA;
    }
}
// 生产B品牌的产品
public class BFactory implements IAbstractFactory {
    private ICar mCarB =new CarB();
    private IPhone mPhoneB = new PhoneB();
    @Override
    public ICar buildCar() {
        mCarB.printColor();
        mCarB.installEngine();
        mCarB.installWheels();
        mCarB.installSystem();
        return mCarB;
    }

    @Override
    public IPhone buildPhone() {
        mPhoneB.printColor();
        mPhoneB.installOS();
        return mPhoneB;
    }
}

抽象工厂的使用方法

我们新建一个Client的类来演示抽象工厂的使用方法

public class Client {
    public static void main(String[] args) {
        // 抽象工厂
        IAbstractFactory mAFactory = new AFactory();
        ICar myAcar = mAFactory.buildCar();
        IPhone myAPhone = mAFactory.buildPhone();
        System.out.println("A工厂造的车: " + myAcar);
        System.out.println("A工厂造的手机: " + myAPhone);

        IAbstractFactory mBFactory = new BFactory();
        ICar myBcar = mBFactory.buildCar();
        IPhone myBPhone = mBFactory.buildPhone();
        System.out.println("B工厂造的车: " + myBcar);
        System.out.println("B工厂造的手机: " + myBPhone);
    }
}

运行结果:
在这里插入图片描述

抽象工厂模式的应用场景

当需要生产多种产品的时候,比如我们的工厂需要造车和造手机时,可以考虑使用抽象工厂模式,比如我们的电器厂,就可以考虑使用抽象工厂模式,因为电器厂既可以生产电视机也能生产空调。,农场也是,农场可以种植物,也可以养动物。

上一篇:解决 nginx 代理 1Panel 后远程无法 ssh-方法解析


下一篇:2024最新面试跳槽,软件测试面试题的整理与解析