美文网首页
设计模式之工厂方法模式

设计模式之工厂方法模式

作者: 代码之尖 | 来源:发表于2018-12-27 11:34 被阅读0次

    英文:Factory Method

    作为抽象工厂模式的孪生兄弟,工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,也就是说工厂方法模式让实例化推迟到子类

                大白话: 要实现哪个类,就new哪个类。

    工厂方法模式非常符合“开闭原则”,当需要增加一个新的产品时,我们只需要增加一个具体的产品类和与之对应的具体工厂即可,无须修改原有系统

    同时在工厂方法模式中用户只需要知道生产产品的具体工厂即可,无须关系产品的创建过程,甚至连具体的产品类名称都不需要知道。虽然他很好的符合了“开闭原则”,但是由于每新增一个新产品时就需要增加两个类,这样势必会导致系统的复杂度增加。

    其UML结构图:

    工厂方法 定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使得一个类的实例化延迟到了子类。 

    工厂方法在简单工厂的基础上再包了一层工厂,所有的工厂都是此工厂的子类。而产生对象的类型由子类工厂决定。使用工厂方法来实现上面的加减乘除对象的创建。

    //定义上级工厂的接口

    public interface IFractory {

        public Operation generateOper();

    }

    //为每一个类创建工厂

    /**

    * 工厂方法  为每个对象生成一个工厂类

    */

    public class AddOperationFactory implements IFractory{

        @Override

        public Operation generateOper() {

            return new AddOperation();

        }

    }

    public class SubOperationFactory implements IFractory {

        @Override

        public Operation generateOper() {

            return new SubOperation();

        }

    }

    public class MulOperationFactory implements IFractory {

        @Override

        public Operation generateOper() {

            return new MulOperation();

        }

    }

    public class DivOperationFactory implements IFractory {

        @Override

        public Operation generateOper() {

            return new DivOperation();

        }

    }

    //客户端代码

    IFractory fractory = new AddOperationFactory();

    Operation operation = fractory.generateOper();

    operation.getResult(firstNum,secondNum);

    工厂方法将类的实例化推迟到了其子类。

    所以使用工厂方法模式时,需要客户端决定实例化哪一个工厂类。

    选择判断问题还是存在的。也就是说,工厂方法把简单的工厂内部逻辑判断转移到了客户端来运行。你想要加的功能,本来是要改工厂类的,而现在是修改客户端。不过,我们在某些情况下通过工厂方法,只需要修改一行实例化的代码就可以实现系统元素的切换(比如切换数据源)。这也是很方便的。

    相关文章

      网友评论

          本文标题:设计模式之工厂方法模式

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