简单工厂模式

简单工厂模式

         简单工厂模式并不属于GoF的23种设计模式。

例子:

  假如存在一个水果类Fruit:该类有一个带参数的构造函数,用来初始化水果名称;还有一个获取水果名称的成员函数。       

Fruit(string name) {
	this->name = name;
	if (name == "apple") {
		//代表苹果
	}
	else if (name == "banana") {
		//2	代表⾹蕉
	}
	else if (name == "pear") {
		//3	代表鸭梨
	}
}
void getName() {
	if (name == "apple") {
		cout << "我是苹果" << endl;
	}
	else if (name == "banana") {
		cout << "我是⾹蕉" << endl;
	}
	else if (name == "pear") {
		cout << "我是鸭梨" << endl;
	}
}

  不难看出,该类包含了大量的条件语句;并且Fruit类的职责太重,负责初始化和显示所有的水果对象,将各种水果对象的初始化代码和显示代码集中在一个类中实现,违反了“单一职责原则”,不利于类的重用和维护;当需要增加新类型的水果时,必须修改Fruit类的源代码,违反了“开闭原则”。

模式中的角色和职责

工厂(Factory)角色:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑、工厂类可以被外界直接调用,创建所需的产品对象。

抽象产品(AbstractProduct)角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

具体产品(ConcreteProduct)角色:简单工厂模式所创建的具体实例对象。

示例 

#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 FruitFactory{
public:
	static AbstractFruit * CreateFruit(string flag) {
		if (flag == "Apple") {
			return new Apple;
		}
		else if (flag == "Orange") {
			return new Orange;
		}
		else {
			return NULL;
		}
	}
};

void test() {
	FruitFactory *factory = new FruitFactory;
	AbstractFruit *fruit = factory->CreateFruit("Apple");
	fruit->showFruitName();
	delete fruit;
	fruit = NULL;
	
	fruit = factory->CreateFruit("Orange");
	fruit->showFruitName();
	delete fruit;
	fruit = NULL;
	delete factory;
}

int main(int argc, char **argv) 
{
    /*用工厂创建一个具体的水果类,返回抽象类指针,反生多态。此时抽象类指针指向了具体的子类
      调用抽象方法,就会调用子类的实现方法*/
	test();
	return 0;
}

简单工厂模式的优缺点

优点:

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

  不需要记住具体类名,记住参数即可,减少使用者记忆量。

缺点:

  对工厂类职责过重,一旦不能工作,系统将会受到影响;

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

  违反“开闭原则”,添加新产品时需要修改工厂逻辑,工厂越来越复杂。

适用场景

工厂类负责创建的对象较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂;

客户端只知道传入工厂类的参数,对如何创建对象并不关心。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值