一、简单工厂,工厂模式,抽象工厂

为什么?

统一管理对象的创建过程式分为多种

工厂模式说起来很虚的感觉,如果构造函数很简单, 直接就可以new出来。那还需要工厂模式做什么?
设计模式嘛,就是要将简单的东西标准化,用统一的模式或者方式去做某件事情,包括创建对象。更重要的是设计模式一直在强调解耦。怎么解耦?通常的方法就是中间加一层——抽象层,高层抽象,底层抽象都向这个中间层靠。
那换句话说,其实是在“封装”代码。将一些常用,会用到的代码进一步封装。
所以会看到,我就简单的new一个对象怎么就要额外的添加那么多个类啊。
因为啊,以后底层的类可能要更改,底层类的构造函数可能要更改,如果使用了工厂模式,那么只需要改这一个抽象层就行了,不用在所有代码里挨个找。

简单工厂模式

这种模式不是标准的23中模式之一。因为它不符合开闭原则。当类新加子类的时候,需要修改代码。

简单工厂模式,统一的返回某个基类的子类实例。

UML

简单工厂模式

代码

//抽象层
class AbCar
{
public:
  virtual  void run()=0;
};

//各个子类
class BWM:public:AbCar
{
public:
  virtual void run()
  {
    //dosomething
  };
};

class QQ:public:AbCar
{
public:
  virtual void run()
  {
    //dosomething
  };
};

//创建工厂
class CarFactory
{
public:
  AbCar create(string type)
  {
    if(type=="BMW")
    {
      return new BWM;
    }elseif(type=="QQ")
      {
        return new QQ;
      }
  }else{
    return nullptr;
  }
}

如果有新加入的子类,那么就要修改CreateCar,这不符合开闭原则。
但这是最近单的一类。用起来也很方便。

工厂模式

为了解决简单工厂模式不符合开闭原则的问题,出现了工厂模式。
工厂模式符合开闭原则。但是,引入了新的类,每一个实例类对应一个创建类。实例类共同继承一个抽象类,创建类共同继承另一个抽象类。两个抽象类之间有依赖关系。
使用时,要创建那个实例类,先创建对应的创建类。

UML

工厂模式

代码

//实例类的共同抽象类
class AbCar
{
public:
  virtual void run()=0;
};

//具体的实例类
class BMW:public:AbCar
{
public:
  virtual viod run()
  {
  }
private:
  int engine;
};

//具体的实例类
class QQ:public:AbCar
{
public:
  virtual viod run()
  {
  }
private:
  int engine;
}

//创建类共同继承的虚类
class AbCarFactory
{
public:
  virtual AbCar *create()=0
}

//具体的创建类
class BMWFactory:public AbCarFactory
{
public:
  virtual AbCar *create()
  {
    return new BMW;
  }
}

//具体的创建类
class QQFactory:public AbCarFactory
{
public:
  virtual AbCar *create()
  {
    return new QQ;
  }
}

//使用
int main()
{
  AbCarFactory *factory=new QQFactory;
  AbCar *qq=factory->create();
  delete factory;
  factory=nullptr;
  //。。。
  return 0;
}

在UML图的中间两层,可以无限的加新的类,新的类型的汽车。
可以看出来,其实更加复杂了有没有。但是如果以后car这个类的constructor变化了,那么只需要修改对应的创建类即可。也就是又“封装了一层”。

抽象工厂模式

工厂模式有个缺点,就是一种创建类只能创建一种实例类的实例。
所以,抽象工厂组合了工厂模式和简单工厂模式。
也是因为这样,所以抽象工厂模式也是不符合开闭原则的。

将同一种类型的创建类合并,一个创建类中放多个createType()函数,每一种type对应返回一种实例类。

UML

抽象工厂模式

代码

//实例类的共同抽象类
class AbCar
{
public:
  virtual void run()=0;
};

//具体的实例类
class BMW01:public:AbCar
{
public:
  virtual viod run()
  {
  }
private:
  int engine;
};

//具体的实例类
class BMW01:public:AbCar
{
public:
  virtual viod run()
  {
  }
private:
  int engine;
}

//创建类共同继承的虚类
class AbCarFactory
{
public:
  virtual AbCar *create()=0
}

//具体的创建类
class BMWFactory:public AbCarFactory
{
public:
  virtual AbCar *createBMW01()
  {
    return new BMW01;
  }
  virtual AbCar *createBMW02()
  {
    return new BMW02;
  }
}

//使用
int main()
{
  AbCarFactory *factory=new BMWFactory;
  AbCar *bmw=factory->createBMW01();
  delete factory;
  factory=nullptr;
  //。。。
  return 0;
}

创建类的抽象类的纯虚函数,在其子类中并没有什么作用,如果两个创建类中能创建的类型并没有共同的特点那?如果两个创建类能够创建的实例并不相同那?
那创建类的基类的纯虚函数,就是个摆设,或者是多余。并不符合借口隔离的原则。

所以我觉得这个抽象工厂模式的应用范围,真是窄。

总结

用的多的应该还是工厂模式。
简单工厂模式弊端大。需要按照参数类型进行创建。扩展不方便,
抽象工厂模式,对于一类产品的扩展和简单工厂模式一样,如果一个创建类要拓展一种创建类型,那么就要添加一个成员函数。如果使用基类继承过来的,那么基类也要加一个。而其他继承这个基类的子类,也新添加了一个类型吗?并不见得。

所以抽象工厂模式,应该应用在大型的,可能持久不变的项目中。

工厂模式更加接地气儿。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容