设计模式:简单工厂_策略模式_工厂方法

 提示:本文是作者根据——程洁《大话设计模式》的总结和感悟,内容可能不涉及相关代码实现,或许不适合初学,仅作参考,请有条件的读者购书进行系统学习,或浏览其他网页进行学习。

目录

本文内容概要

  1. 简单工厂
  2. 策略模式
  3. 工厂方法
  4. 简单工厂和工厂方法_实现对比

1.简答工厂:

       如果是实现一个计算器,就要考虑加减乘除的功能,那么这些功能就要封装成函数,但是处于对未来维护的考虑,把相关代码封装成类。由用户进行逻辑判断,但是还有一个问题就是,对用户逻辑的判断优化,如果将判断结构放在客户端主函数上,是很不适合的,所以可以对这个步骤再进行一次封装,也就是:一个类(Class  operationFactor)根据用户传进来的需求进行创建对象(这些类都继承一个Class  Operation 父类)并返回。

2.策略模式:

定义: 

    策略模式定义了算法家族,分别封装起来,让它们之间可以互相替换,此设计模式让算法变化,不会影响到使用算法的用户。 这里共两个类:Class  Context、Class  Strategy 。其中Strategy 是一个公共父类,我们可以按需去继承父类Strategy,并对父类中实现算法的虚函数进行重写(覆盖)而Context 是重新实现构造函数,那么之后就可以通过父类对象去调用此算法,这种方法更像是(类似)工厂方法和策略模式的结合          eg:

class Strategy
{
public:
    virtual void AlgorithmInterface()
    {
        //子类需要重写
    }
};
 
class Context
{
    Strategy* strategy;
    public:
        Context(Strategy& S)//传入子类引用
        {
            strategy = &S;//取子类地址
        }
        void AlgorithmInterface()
        {
			strategy->AlgorithmInterface();
        }
};

    策略模式和简单工厂的结合:

    把选择判断的流程从客户端封装起来,再次对Class Context进行修改,利用switch结构,根据传入的用户需求返回用户所需对象。 

3.工厂方法

定义了一个用于创建对象的接口,让子类决定实例化哪一个类,工程方法使一个类的实例化延迟到类其子类。其实就是,继承一个接口类,创建符合要求的子类对象,在客户端用户直接利用多态,父类指针指向子类对象,并直接调用函数。(上面说类似,就是因为这一点;策略模式是将算法类作为Context 的构造函数的参数传入,用户直接通过对Context 的对象进行算法调用)

4.简单工厂和工厂方法_实现对比

·简单工厂模式的最大优点就是:                                                                                                                                                               在于类内实现了必要的逻辑判断,根据用户的选择条件动态实例相关的类,对于用户来说,去除了与具体产品的依赖。                 但是,如果我有了新的需求就要在switch 里添加新的case分支,也就是说我们不但对扩展开放了对修改也开放了,这就违背了开闭原则。 于是我们才有了工厂模式,每次有了新的需求,只需要对(父类)接口类进行继承并对虚函数重写就可以了,不会对破坏开闭原则。   其实工厂方法实现时,客户端需要决定实例化哪一个工厂,来实现运算类,也就是说选择判断的问题还是存在的,工厂方法把简单工厂的内部逻辑判断移动到类客户端进行。所以现在 加功能的话,本来是改工厂类的,而现在是修改客户端。                             

·工厂方法模式的最大优点就是:                                                                                                                                                                克服了简单工厂违背开闭原则的缺点,又保持类封装函数对象创建过程的优点。                                                                      ·两者都是集中封装了对象的创建,使得要更换对象时,不需要做太多的改动就可实现,降低了客户程序与产品对象的耦合,工厂方法是简单工厂的进一步抽象和推广

总结:                                                                                                                                                                                                       简单工厂的优点是,类里包含了必要的逻辑判断,根据用户需求动态实例化对象,但是一旦用户需求变化,不仅仅需要添加子类,还要对类内的case分支进行修改,违背了开闭原则(扩展开放-修改关闭), 工厂方法继承了简单工厂动态实例化对象的优点,克服了违背开闭原则的缺点,但是它将逻辑判断移到了客户端,而且每一次扩展时,都要加一个类增加了额外的开销。不过这两者都是集中封装了对象的创建,使得要更换的对象时,不许做大改动就能实现,降低了客户程序与产品对象的耦合。工厂模式就是简单工厂的进一步抽象和推广。                                                                                              

                                                                                                   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值