代码改变世界

抽象工厂模式

2019-02-27 15:14  剑动情缥缈  阅读(160)  评论(0编辑  收藏  举报

1.基本概念

  • 定义:即Abstract Factory Pattern,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类;具体的工厂负责实现具体的产品实例。
  • 与工厂方法模式的区别:抽象工厂中每个工厂可以创建多种类的产品(通过多个方法);而工厂方法每个工厂只能创建一类。
  • 解决的问题:每个工厂只能生产一种产品
  • UML类图

  

  • 模式组成

  

2.代码

package com.chengjie;

//抽象产品类
abstract class AbstractProduct {
    abstract void show();
}

//抽象产品族类
abstract class ContainerProduct extends AbstractProduct {
    @Override
    public abstract void show();
}

class ContainA extends ContainerProduct {
    @Override
    public void show() {
        System.out.println("生成了容器A!");
    }
}

class ContainB extends ContainerProduct {
    @Override
    public void show() {
        System.out.println("生成了容器B!");
    }
}

abstract class MouldProduct extends AbstractProduct {
    @Override
    public abstract void show();
}

class MouldA extends MouldProduct {
    @Override
    public void show() {
        System.out.println("生成了模具A!");
    }
}

class MouldB extends MouldProduct {
    @Override
    public void show() {
        System.out.println("生成了模具B!");
    }
}

abstract class AbstractFactory {
    abstract AbstractProduct createContain();
    abstract AbstractProduct createMould();
}

class FactoryA1 extends AbstractFactory {
    @Override
    AbstractProduct createContain() {
        return new ContainA();
    }

    @Override
    AbstractProduct createMould() {
        return new MouldA();
    }
}

class FactoryB1 extends AbstractFactory {
    @Override
    AbstractProduct createContain() {
        return new ContainB();
    }

    @Override
    AbstractProduct createMould() {
        return new MouldB();
    }
}
public class TestAbstractFactoryPattern {
    public static void main(String[] args) {
        FactoryA1 fa = new FactoryA1();
        fa.createContain().show();
        fa.createMould().show();
    }
}
View Code

3.优点

  • 每种工厂可以创建多个产品
  • 降低耦合:具体产品的创建延迟到具体产品的子类中

4.缺点

  • 无法支持新种类产品的变化

5.应用场景

  • 一个系统不要求依赖产品类实例如何被创建、组合和表达的表达,这点也是所有工厂模式应用的前提。
  • 这个系统有多个系列产品,而系统中只消费其中某一系列产品
  • 系统要求提供一个产品类的库,所有产品以同样的接口出现,客户端不需要依赖具体实现

6.参考

  https://www.jianshu.com/p/7deb64f902db