第二篇 设计模式之工厂方法模式

欢迎转载http://blog.csdn.net/Passi_zxj/article/details/52793255

简介

  • 工厂类不再负责产品的创建,由工厂的子类负责
  • 通常包含
    • 抽象工厂 工厂基类,其接口子类必须实现
    • 具体工厂 工厂子类,在这里创建产品
    • 抽象产品 父指针指向的对象
    • 具体产品 子类指针指向的对象

背景

  • 使用者清楚的知道哪个产品对应哪个工厂,然后他只需要去实例化这个工厂就可以。
    • 比如collection 中的迭代器 ,你使用迭代器之前你就该知道你的collection是什么类别,当然你就知道该调什么工厂去实现
  • 只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。(来自百度百科,目前我也不懂。。

一言以蔽之

有了抽象工厂以后,每个产品的生产就都交给其子类(具体)实现了,遵循了抽象封闭原则

//抽象产品
class Animal
{
  public:
    void Walk()
    {
        printf("i am walking...\n");
    };

    void Sleep()
    {
        printf("i am sleepping...\n");
    };
};

//具体产品
class Dog : public Animal
{

};

class Cat : public Animal
{

};

//抽象工厂
class AnimalFactory
{
  public:
    virtual Animal createAnimal() = 0 ;
};

//具体工厂
class CatFactory
{
  public:
    Animal createAnimal()
    {
        return new Cat ;
    }
};

class DogFactory: public AnimalFactory
{
  public:
    Animal createAnimal()
    {
        return new Dog ;
    };
}

//客户端,使用者 或者也叫做消费者代码
AnimalFactory *factory = new DogFactory ;//要换成“猫”,只需要修改这个工厂就ok了
Animal *dog = factory->createAnimal();
dog->Walk() ;

review

  • 如果这个程序给我做的话,我能想到把Animal给抽象出来,也就是之前所说的简单工厂模式,这里是把创建Animal的工厂也给抽象了,这样就克服了简单工厂违背的“开放-封闭原则”
  • 因此也解决了简单工厂里超大的switch的问题,本身简单工厂里的switch就处理了多个产品,所以耦合很重,现在再也不用担心会把这个switch撑爆啦!

advantage

  • 当引进新的产品时,不需要修改具体工厂方法
  • 降低了客户程序与产品间的耦合
  • 当客户端更换对象时,不需要做大的改动(前提是已经有这个对象的工厂了)

disadvantage

  • 每增加一类产品,就需要增加相应的产品工厂,增加了开发量

使用场合

见背景里面的描述,当然希望下次能把这两个分开叙述

Tips

  • 下一章更新抽象工厂模式 PS: 这里不是已经有了抽象工厂吗,怎么还有一个抽象工厂模式?
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值