zoukankan      html  css  js  c++  java
  • 设计模式——工厂方法模式

    设计模式——工厂方法模式#


    阅读本文需要先阅读 简单工厂模式

    今天我们依然通过运算器来讲解工厂方法模式。

    首先,回顾一下简单工厂模式的几个步骤。

    1. 将运算类进行抽象,提取公共部分与接口。
    2. 工厂类掌握各个具体运算类,通过参数产生各种运算实例。

    假如理解了简单工厂,那么工厂方法模式就比较简单了,它实际上就是将工厂也进行了抽象,提取了工厂类的接口。具体如下

    class IFactory//抽象的工厂接口
    {
    	public Operator CreateOperator();
    };
    class PlusFactory:public IFactory//具体的工厂类
    {
    	public Operator CreateOperator()
    	{
    		return PlusOperator();
    	}
    };
    class SubtractFactory:public IFactory//具体的工厂类
    {
    	public Operator CreateOperator()
    	{
    		return SubtractOperator();
    	}
    };
    class MultiplicationFactory:public IFactory//具体的工厂类
    {
    	public Operator CreateOperator()
    	{
    		return MultiplicationOperator();
    	}
    };
    class DivisionFactory:public IFactory//具体的工厂类
    {
    	public Operator CreateOperator()
    	{
    		return DivisionOperator();
    	}
    };
    void main()
    {
    	IFactory *plusFac = new PlusFactory();				//1
    	Operator *opera = plusFac->CreateOperator();		//2
    	opera->numA = 1;
    	opera->numB = 1;
    	cout<<opera->GetResult()<<endl;
    }
    

    还记得简单工厂的缺点吧:违背了对修改封闭,对扩张开放的原则。而在工厂方法这种方法里面,当我们需要增加一种运算方式的时候,只需要添加一个新的运算类,添加一个新的工厂方法,修改上述客户端中1,2部分。
    但是比起简单工厂,这实际上又把逻辑的判断又重新搬回了客户端,所以,我们还需要对上述的代码进行修改。那工厂方法的优势何在呢?看下面的代码

    void main()
    {
        //1
    	Operator *plus1_1 = OperationFactory::CreateOperator(Plus);
    	Operator *plus1_2 = OperationFactory::CreateOperator(Plus);
    	...
    	Operator *plus1_N = OperationFactory::CreateOperator(Plus);
    	//2
    	IFactory *factory = new PlusFactory();
    	Operator *plus2_1 = factory->CreateOperator();
    	Operator *plus2_2 = factory->CreateOperator();
    	...
    	Operator *plus2_N = factory->CreateOperator();
    }
    

    第一部分使用了简单工厂的方法实现了加法,第二部分使用了工厂方法模式实现了加法。那么,假如我们需要将所有的运算操纵修改为减法,简单工厂需要修改多少行代码呢,答案是N。上面那些重复的代码都需要修改。假如是工厂方法模式需要修改多少行代码呢,答案是1。

    //IFactory *factory = new PlusFactory();
    IFactory *factory = new SubtractFactory();
    

    怎么样?是不是很神奇,我也觉得很神奇,所以跟大家分享一下。

    总结#

    1. 工厂方法模式将简单工厂的接口抽象出来,组成一个接口类
    2. 将简单工厂的大工厂拆分为了一个个小工厂,每个具体的小工厂实现自己的接口
    3. 比起简单工厂,遵守了面对对象设计的”对扩展开放,对修改封闭“的原则
    4. 缺点:客户端又需要自己进行逻辑判断,自己判断使用哪个工厂类。
  • 相关阅读:
    DRF之url注册器组件
    序列化组件的使用及接口设计和优化
    Django 内置字段
    Django 的 ModelForm组件
    Django组件 中间件
    csrf
    django使用redis做缓存
    微信消息推送
    自定制serilazry字段
    小知识,大智慧(restframework 拾忆)
  • 原文地址:https://www.cnblogs.com/suimeng/p/5172450.html
Copyright © 2011-2022 走看看