c++设计模式 ----工厂模式

一:概念理解:

1.它提供了一种创建对象的最佳方式;

2. 在工厂模式中,我们创建对象不会对客户端暴露创建逻辑,并且是使用一个共同的接口来指向创建的对象

3.工厂模式利用了什么特性,怎么使用的呢?

        1)C++多态的特性

        2)使用方式:三层类关系,基类、派生类、工厂类。将存在继承关系的类,通过一个工厂类创建对应的子类(派生类)对象;

        3)在项目复杂的情况下,可以便于子类对象的创建;

4.工厂模式和new模式有什么区别?

        1)工厂模式是我们比较常用的实例化对象模式;用工厂方法代替new操作的一种模式;

        2)工厂模式有三种:简单工厂模式、工厂方法模式和抽象工厂模式;

二:工厂模式的应用场景

1.怎样理解工厂模式的目的?

       1)目的是为了实现解耦,将对象的创建和使用分开,即应用程序将对象的创建和初始化的职责交给工厂对象。

       2)例:若一个对象A想要调用对象B,如果直接通过new关键字来创建一个B实例,然后调用B实例,这样做有这样一个不好的地方:当需求变更是,要将B实例换成C实例时,需要修改所有new了该实例的方法;

2.怎样理解降低代码的重复?

如果对象B的创建过程比较复杂,并且很多地方都用到了,那么很可能出现很多重复的代码,通过统一将创建对象B的代码放到工厂里面统一管理,可以减少代码的重复率,同时也方便维护。相比于构造函数来说,复杂的初始化,会使得构造函数非常的复杂。由于创建过程都由工厂统一的管理,有利于当业务发生变化之后的修改
3.怎样理解工厂模式  将对象的创建和使用分离?

工厂模式将创建和使用分离,使用者不需要知道具体的创建过程,只需要使用即可。

4.类本身有很多子类,并且经常性发生变化。

创建对象需要大量重复的代码。

创建对象需要访问某些信息,而这些信息不应该包含在复合类中。

创建对象的生命周期必须集中管理,以保证在整个程序中具有一致的行为。

三:简单工厂模式

1.特点:

        1)它是一个具体的类,非接口 抽象类。

        2)有一个重要的create()方法,利用if或者 switch创建产品并返回。

        3)create()方法通常是静态的,所以也称之为静态工厂。

2.优点:

        1)将对象的创建交给专门的工厂类负责,实现了对象的创建和对象的使用分离;

        2)提供专门的 工厂类 用于创建对象

        3) 客户端 无需知道所创建的产品类的类名 , 只需要知道对应产品类的参数即可创建对象实        例.

3.缺点:

        1)工厂类职责过重,扩展性非常差,如果要增加新的产品 , 需要修改工厂类的判断逻辑

        2)类型多时,不易维护 , 违背"开闭原则";.

        3)不支持不同的产品需要不同额外参数的情况;

4.简单工厂模式的适用场景?

        一般适用于满足下面两个条件的场景:

        1)创建对象少:工厂类负责创建的对象比较少一些;

        2)不关心对象的创建过程:客户端只知道传入工厂类的参数,对于如何创建对象则不关心;

5.试举一个简单工厂的应用实例(代码)?

        1)基类(抽象产品类):ISkill为功法的抽象类(基类),接口函数为Description(),      

              用于描述功法特点;

        2)派生类(具体产品类):YJJSkill 、SZJSkill 、XWXGSkill为具体功法的类,

            分别易筋经、神照经、小 相功,它们都继承于ISkill抽象类。

        3)工厂类:SimpleSkillFactory,类成员包括enum对象,

功法工厂中有诸多功法、例如易筋经、神照经、小无相功、先天功等等。
每个功法各有特点,根据自身情况去选择合适自己的功法修行.
ISkill为功法的抽象类(基类),接口函数为Description(),用于描述功法特点.
YJJSkill 、SZJSkill 、XWXGSkill为具体功法的类,分别易筋经、神照经、小无相功,它们都继承于ISkill抽象类。
代码示例:

//抽象产品类:

class ISkill

{

public:

        virtual ~ISkill() {};

        virtual void Description() = 0;

};

//具体产品类

//1. 易筋经

class YJJSkill : public ISkill

public:
    void Description()//功法描述
    {
        std::cout << "达摩祖师所创,佛家至高绝学,练法古拙朴实,进无止境." << std::endl;
    } 
};

// 2.神照经 
class SZJSkill : public ISkill

public:
    void  Description()
    {
        std::cout << "极其精纯的内功,习得大乘,全身内空完全充盈,有起死回生之效" << std::endl;
    } 
};

// 3.小无相功 
class XWXGSkill : public ISkill

public:
    void Description()
    {
        std::cout << "逍遥派的一门内功,威力强大,不着形相,无迹可寻,只要身具此功,可以模仿别人的绝学甚至胜于原版。" << std::endl;
    }
};
 

//工厂类
public class SimpleSkillFactory
{
public:
   enum SKILL_TYPE
   {
           TYPE_YJ ,//易筋经
           TYPE_SZ ,//神照经
           TYPE_XW //小无相功
   };
public :
    static ISkill createSkill(int type)
     {
        switch (type) {
            case TYPE_YJ :
                return new YJJSkill();
            case TYPE_SZ :
                return new SZJSkill();
            case TYPE_XW :
                return new XWXGSkill();
             default:
               return NULL;
               break;
        }
    }
}
 

//使用:

//目前功法工厂就提供三种功法,这里,我选择修行易筋经来筑基. 

//注意:我们只是调用了工厂类的 成员方法

ISkill m_Skill = SimpleSkillFactory.createSkill(SimpleSkillFactory::TYPE_YJ); m_Skill.Description();

参考:https://blog.csdn.net/qq_21438461/category_11878258.html

  • 31
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值