设计模式——(二)工厂方法模式

1.简单工厂模式。±*/继承基类的方法。在工厂类中有个基类的对象根据传入的在switch创建对象。客户端

 Operator *op = OperatorFactory::creatOperator(1);
    op->setA(5);
    op->setB(4);
double a =  op->getResult()
  1. 工厂方法模式
    在这里插入图片描述
    ±*/继承基类的方法。客户端Base *b = new BaseAdd(); b.getResult();
    若增加一个新的开方类,简单工厂模式:增加一个类,在工厂中增加case的分支,客户端不用变。
    工厂方法模式,加功能类,加工厂方法类,还需要改客户端。

工厂方法和简单工厂的区别:简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化的类。对于客户端来说,去除了与具体产品的依赖。但增加case判断,修改了原有的工厂类,不但扩展开放,连原有的修改也开放了,违背了开放封闭原则。

工厂方法模式

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

工厂方法模式结构图

在这里插入图片描述
根据依赖倒转原则将工厂方法也抽象出一个接口这个接口只有一个方法,就是创建抽象产品的工厂方法。然后,所有的要生产具体类的工厂,去实现这个接口,这样一个简单工厂模式的工厂类,变成了一个工厂抽象接口和多个具体生成对象的工厂。这样新增开方功能时,就不需要更改原有的工厂类了,只需要增加此功能的运算类和相应的工厂类就可以。

工厂方法模式UML类图

在这里插入图片描述
这样工厂和产品体系都没有修改变化,只是扩展了变化,完全符合开放封闭原则。
工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,即工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。本来加的功能应该在工厂类的,现在在客户端。

// 简单工厂模式: 学雷锋
class LeiFeng {
public:
    void Sweep()
    {
        cout << "扫地" << endl;
    }
    void Wash()
    {
        cout << "洗衣" << endl;
    }
};
class Student : public LeiFeng{

};
class Volunteer: public LeiFeng {

};
//简单雷锋工厂
class SimpleFactory {
public:
    LeiFeng* creatLf(int type)
    {
        LeiFeng* lf = NULL;
        switch (type)
        {
        case 1: lf = new Student; break;
        case 2: lf = new Volunteer; break;
        default:
            break;
        }
        return lf;
    }
};
int main()
{
    std::cout << "Hello World!\n";
   /* LeiFeng* lf = new Student;
    lf->Sweep();
    lf = new Volunteer;
    lf->Wash();*/
    SimpleFactory* s = new SimpleFactory;
    LeiFeng  *lf = s->creatLf(1);
    lf->Sweep();
}

工厂方法模式C++代码

C++工厂方法代码
class LeiFeng {
public:
    void Sweep()
    {
        cout << "扫地" << endl;
    }
    void Wash()
    {
        cout << "洗衣" << endl;
    }
};
class Student : public LeiFeng {

};
class Volunteer: public LeiFeng {

};
//学雷锋工厂
class LFactory{
public:
    virtual LeiFeng* CreatLeiFeng() = 0;
};
class StudentFactor : public LFactory {
public:
    virtual LeiFeng* CreatLeiFeng()
    {
        cout << "Student ::CreatLeiFeng() " << endl;
        return new Student();
    }
};
class VolunteerFactor : public LFactory {
public:
    virtual LeiFeng* CreatLeiFeng()
    {
        cout << "VolunteerFactor ::CreatLeiFeng() " << endl;
        return new Volunteer();
    }
};

int main()
{
    std::cout << "Hello World!\n";
    LFactory* fa = new VolunteerFactor();  //
    LeiFeng* lf = fa->CreatLeiFeng();
    lf->Sweep();
}

工厂方法模式是简单工厂模式的进一步抽象和推广,由于使用了多态性,保持了简单工厂模式的优点,克服了缺点,但每增加一个产品,就要增加一个产品工厂的类,增加了额外的开发量。(反射可以解决)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值