抽象工厂模式(AbstractFactory)

举例说明:

/**
 * 作者:wanglei
 * 邮箱:[email protected]
 * 抽象工厂模式
 * 工厂类
 */
abstract class Factory {
    /**
     * @return 制造容器
     */
    public abstract Product ManufactureContainer();

    /**
     * @return 制造模具
     */
    public abstract Product ManufactureMould();
}

/**
 * A厂 - 生产模具+容器产品
 */
class FactoryA extends Factory{

    @Override
    public Product ManufactureContainer() {
        return new ContainerProductA();
    }

    @Override
    public Product ManufactureMould() {
        return new MouldProductA();
    }
}

/**
 *B厂 - 生产模具+容器产品
 */
class FactoryB extends Factory{

    @Override
    public Product ManufactureContainer() {
        return new ContainerProductB();
    }

    @Override
    public Product ManufactureMould() {
        return new MouldProductB();
    }
}
/**
 * 作者:wanglei 
 * 邮箱:[email protected]
 * 抽象工厂模式
 * 抽象产品族类
 */
abstract class Product {
    public abstract void show();
}

/**
 * 容器产品抽象类
 */
abstract class ContainerProduct extends Product {
    @Override
    public void show() {

    }
}

/**
 * 模具产品抽象类
 */
abstract class MouldProduct extends Product{
    @Override
    public void show() {

    }
}

/**
 * 容器产品A类
 */
class ContainerProductA extends ContainerProduct{
    @Override
    public void show() {
        System.out.println("生产出了容器产品A");
    }
}

/**
 * 容器产品B类
 */
class ContainerProductB extends ContainerProduct{
    @Override
    public void show() {
        System.out.println("生产出了容器产品B");
    }
}

/**
 * 模具产品A类
 */
class MouldProductA extends MouldProduct{
    @Override
    public void show() {
        System.out.println("生产出了模具产品A");
    }
}

/**
 * 模具产品B类
 */
class MouldProductB extends MouldProduct{
    @Override
    public void show() {
        System.out.println("生产出了模具产品B");
    }
}
/**
 * 作者:wanglei 
 * 邮箱:[email protected]
 * 抽象工厂模式
 * 定义:
 * 1.抽象工厂模式,即Abstract Factory Pattern,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类;具体的工厂负责实现具体的产品实例。
 * 2.抽象工厂模式与工厂方法模式最大的区别:抽象工厂中每个工厂可以创建多种类的产品;而工厂方法每个工厂只能创建一类
 * 主要作用:
 * 1.允许使用抽象的接口来创建一组相关产品,而不需要知道或关心实际生产出的具体产品是什么,这样就可以从具体产品中被解耦。
 * 解决的问题:
 * 每个工厂只能创建一类产品,即工厂方法模式的缺点
 * 实例概况:
 * 背景:小成有两间塑料加工厂(A厂仅生产容器类产品;B厂仅生产模具类产品);随着客户需求的变化,A厂所在地的客户需要也模具类产品,B厂所在地的客户也需要容器类产品;
 * 冲突:没有资源(资金+租位)在当地分别开设多一家注塑分厂
 * 解决方案:在原有的两家塑料厂里增设生产需求的功能,即A厂能生产容器+模具产品;B厂间能生产模具+容器产品。
 */
public class SimpleFactoryPattern {

    public static void main(String[] args) {
        FactoryA factoryA = new FactoryA();
        FactoryB factoryB = new FactoryB();
        //A厂当地客户需要容器产品A
        factoryA.ManufactureContainer().show();
        //A厂当地客户需要模具产品A
        factoryA.ManufactureMould().show();
        //B厂当地客户需要容器产品B
        factoryB.ManufactureContainer().show();
        //B厂当地客户需要模具产品B
        factoryB.ManufactureMould().show();
    }
}


/**
 * 结果:
 * 生产出了容器产品A
 * 生产出了模具产品A
 * 生产出了容器产品B
 * 生产出了模具产品B
 * 优点:
 * 1.降低耦合:
 * 抽象工厂模式将具体产品的创建延迟到具体工厂的子类中,这样将对象的创建封装起来,可以减少客户端与具体产品类之间的依赖,从而使系统耦合度低,这样更有利于后期的维护和扩展;
 * 2.更符合开-闭原则:
 * 新增一种产品类时,只需要增加相应的具体产品类和相应的工厂子类即可::简单工厂模式需要修改工厂类的判断逻辑
 * 3.符合单一职责原则:
 * 每个具体工厂类只负责创建对应的产品::简单工厂中的工厂类存在复杂的switch逻辑判断
 * 4.不使用静态工厂方法,可以形成基于继承的等级结构。::简单工厂模式的工厂类使用静态工厂方法
 * 缺点:
 * 1.抽象工厂模式很难支持新种类产品的变化。这是因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,这样也就违背了“开发——封闭”原则。
 * 2.对于新的产品族符合开-闭原则;对于新的产品种类不符合开-闭原则,这一特性称为开-闭原则的倾斜性。
 * 应用场景:
 * 1.一个系统不要求依赖产品类实例如何被创建、组合和表达的表达,这点也是所有工厂模式应用的前提。
 * 2.这个系统有多个系列产品,而系统中只消费其中某一系列产品
 * 3.系统要求提供一个产品类的库,所有产品以同样的接口出现,客户端不需要依赖具体实现。
 */

你可能感兴趣的:(抽象工厂模式(AbstractFactory))