一:概念理解:
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();