设计模式(五)抽象工厂模式

2021-08-29  本文已影响0人  deve_雨轩

概念

前面的工厂方法模式中考虑的只是一类产品的生产,如汽车厂只生产汽车,电视机厂只生产电视机等。同种类称为同等级,也就是说:工厂方法模式只考虑生产同等级的产品,但是在现实生活中许多工厂是综合型的工厂,能生产多等级(种类)的产品,如机车厂里既生产传统汽车也生产电动汽车,电器厂既生产电视机又生产洗衣机或空调等。

为了更清晰地理解工厂方法模式,我们先理解下面两个概念:

实现方式

抽象工厂模式是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。

抽象工厂模式同工厂方法模式一样,也是由抽象工厂、具体工厂、抽象产品和具体产品等 4 个要素构成,但抽象工厂中方法个数不同,抽象产品的个数也不同。

模式结构如下:

下面我们就通过设计一个农场例子来熟悉一下抽象工厂吧。

抽象产品

/**
 * 动物抽象
 */
public interface Animal {

    /**
     * 小动物出生
     */
    Animal bornAnimal();

}

/**
 * 植物抽象
 */
public interface Plant {

    /**
     * 开花结果
     */
    Plant bloom();

}

产品实现

public class CatAnimal implements Animal{
    @Override
    public Animal bornAnimal() {
        System.out.println("小猫咪出生啦");
        return new CatAnimal();
    }
}
public class DogAnimal implements Animal{
    @Override
    public Animal bornAnimal() {
        System.out.println("小旺仔出生啦");
        return new DogAnimal();
    }
}

public class ApplePlant implements Plant{
    @Override
    public Plant bloom() {
        System.out.println("苹果熟了");
        return new ApplePlant();
    }
}

public class OrangePlant implements Plant{
    @Override
    public Plant bloom() {
        System.out.println("橘子熟了");
        return new OrangePlant();
    }
}

抽象工厂

/**
 * 抽象农场
 */
public interface FramFactory {

    /**
     * 创建动物
     */
    Animal newAnimal();

    /**
     * 创建植物
     */
    Plant newPlant();

}

工厂实现

/**
 * 天天农场
 */
public class DayDayFramFactory implements FramFactory{
    @Override
    public Animal newAnimal() {
        return new CatAnimal();
    }

    @Override
    public Plant newPlant() {
        return new OrangePlant();
    }
}

/**
 * 开心农场
 */
public class HappyFramFactory implements FramFactory{
    @Override
    public Animal newAnimal() {
        return new DogAnimal();
    }

    @Override
    public Plant newPlant() {
        return new ApplePlant();
    }
}

至此我们就实现了一个非常简单的抽象工厂模式的样例。

抽象工厂模式的扩展有一定的“开闭原则”倾斜性:

另一方面,当系统中只存在一个等级结构的产品时,抽象工厂模式将退化到工厂方法模式。

上一篇下一篇

猜你喜欢

热点阅读