美文网首页
抽象工厂

抽象工厂

作者: 熊猫派 | 来源:发表于2019-01-25 14:54 被阅读0次

    提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。

    模式结构

    1.AbstractFactory:抽象工厂(声明了一组用于创建对象的方法, 注意是 一组。)
    2.ConcreteFactory:具体工厂(它实现了在抽象工厂中声明的创建对象的方法,生成一组具体对象。)
    3.AbstractProduct:抽象产品
    4.Product:具体产品
    UML:

    AbatractFactory.jpg

    与工厂方法最大的不同点

    抽象工厂中每个工厂可以创建多种类的产品;而工厂方法每个工厂只能创建一类。

    使用步骤

    1.创建抽象工厂类

    //抽象工厂接口
    public abstract class AbstractCreator  {
        public abstract AbstractProduct ManufactureContainer();
        public abstract AbstractProduct ManufactureMould();
    }
    

    2.创建抽象产品族类

    //抽象产品族类
    public abstract class AbstractProduct {
        //所有产品类的公共业务方法
        public void methodSame() {
            //公共方法的实现
        }
        //声明抽象业务方法
        public  abstract void methodDiff();
    }
    

    3.创建抽象产品类

    //模块产品抽象类
    public abstract class MouldProduct extends AbstractProduct{
        @Override
        public abstract void methodDiff();
    }
    //容器产品抽象类
    public abstract class ContainerProduct extends AbstractProduct {
        @Override
        public abstract void methodDiff();
    }
    
    1. 创建具体产品类(继承抽象产品类)
    //模块产品A
    public class MouldProductA extends MouldProduct {
        @Override
        public void methodDiff() {
            System.out.println("生产出了模块产品A");
        }
    }
    //模块产品B
    public class MouldProductB extends MouldProduct {
        @Override
        public void methodDiff() {
            System.out.println("生产出了模块产品B");
        }
    }
    //容器产品A
    public class ContainerProductA extends ContainerProduct {
        @Override
        public void methodDiff() {
            System.out.println("生产出了容器产品A");
        }
    }
    //容器产品B
    public class ContainerProductB extends ContainerProduct {
        @Override
        public void methodDiff() {
            System.out.println("生产出了容器产品B");
        }
    }
    
    

    5.创建具体工厂类(继承抽象工厂类)

    //具体工厂A
    public class FactoryA extends AbstractCreator{
    
        @Override
        public AbstractProduct ManufactureContainer() {
            return new ContainerProductA();
        }
    
        @Override
        public AbstractProduct ManufactureMould() {
            return new MouldProductA();
        }
    }
    //具体工厂B
    public class FactoryB extends AbstractCreator {
        @Override
        public AbstractProduct ManufactureContainer() {
            return new ContainerProductB();
        }
    
        @Override
        public AbstractProduct ManufactureMould() {
            return new MouldProductB();
        }
    }
    
    

    6.客户端通过实例化具体的工厂类

    //生产工作流程
    public class AbstractFactoryPattern {
        public static void main(String[] args){
            FactoryA mFactoryA = new FactoryA();
            FactoryB mFactoryB = new FactoryB();
            //A厂当地客户需要容器产品A
            mFactoryA.ManufactureContainer().methodDiff();
            //A厂当地客户需要模具产品A
            mFactoryA.ManufactureMould().methodDiff();
    
            //B厂当地客户需要容器产品B
            mFactoryB.ManufactureContainer().methodDiff();
            //B厂当地客户需要模具产品B
            mFactoryB.ManufactureMould().methodDiff();
    
        }
    }
    

    优点

    -降低耦合
    可以减少客户端与具体产品类之间的依赖,从而使系统耦合度低,这样更有利于后期的维护和扩展;
    -更符合开-闭原则
    新增一种产品类时,只需要增加相应的具体产品类和相应的工厂子类即可
    -符合单一职责原则
    每个具体工厂类只负责创建对应的产品
    -不使用静态工厂方法,可以形成基于继承的等级结构。

    缺点

    -抽象工厂模式很难支持新种类产品的变化
    这是因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,这样也就违背了“开发——封闭”原则。

    应用场景

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

    相关文章

      网友评论

          本文标题:抽象工厂

          本文链接:https://www.haomeiwen.com/subject/prrujqtx.html