工厂方法模式

模式中的角色和职责

抽象工厂(Abstract Factory)角色:工厂方法模式的核心,任何工厂类都必须实现这个接口;

工厂(Concrete Factory)角色:具体工厂类是抽象工厂的一个实现,负责实例化产品对象;

抽象(Abstract Product)产品:工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口;

具体产品(Concrete Product)角色:工厂方法模式所创建的具体实例对象。

   简单工厂模式 + “开闭原则” = 工厂方法模式

案例

#include <iostream>
#include <cstdlib>
using namespace std;
/*创建一个水果抽象类供具体的水果实现和抽象工厂的返回*/
class AbstractFruit {
public:
	virtual void showFruitName() = 0;
};
/*若想添加一种新水果,则不再需要去修改其中任何一个类,
   而只需要实现一个新水果工厂和一个新水果具体类即可*/
class Apple :public AbstractFruit {
public:
	virtual void showFruitName() {
		cout << "Apple" << endl;
	}
};

class Orange : public AbstractFruit {
public:
	virtual void showFruitName() {
		cout << "orange" << endl;
	}
};
/*创建一个抽象工厂类,供具体的水果工厂实现,并返回抽象水果类*/
class AbstractFruitFactory {
public:
	virtual AbstractFruit* CreateFruit() = 0;
};
/*实现抽象工厂,并返回一个抽象水果指针*/
class AppleFactory : public AbstractFruitFactory {
public:
	virtual AbstractFruit* CreateFruit() {
		return new Apple;
	}
};

class OrangeFactory : public AbstractFruitFactory {
public:
	virtual AbstractFruit* CreateFruit() {
		return new Orange;
	}
};

void test() {
	/*根据依赖倒转原则,是针对接口的编程。即只需要使用抽象工厂
	  类的指针和抽象水果类的指针,通过多态的特性,就可以完成具
	  体类的业务。*/
	AbstractFruitFactory *FruitFactory = NULL;
	AbstractFruit *fruit = NULL;
	/*抽象类指针,完成Apple业务*/
	FruitFactory = new AppleFactory;
	fruit = FruitFactory->CreateFruit();
	fruit->showFruitName();
	delete fruit;
	delete FruitFactory;
}

int main(int argc, char **argv) 
{
	test();
	return 0;
}

工厂方法模式的优缺点

优点

  不需要记住具体类名,甚至不需要记住具体的参数;

  实现了对象创建和使用的分离;

  系统的可扩展性提高,无需修改接口和原类。

缺点

  增加系统中的类的个数,复杂度和理解度增加;

  增加了系统的抽象性和理解难度。

适用场景

  客户端不知道它所需要的对象的类;

  抽象工厂通过其子类来指定创建哪个对象。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值