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

设计模式之工厂方法模式

作者: 代码之尖 | 来源:发表于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