设计模式-简单工厂和工厂方法

24 阅读1分钟

简单工厂 Simple Factory 把对象的创建封装在一个接口函数里面,通过传入不同的标识,返回创建的对象,客户不用自己负责new对象,不用了解对象创建的详细过程 提供创建对象实例的接口函数不闭合,不能对修改关闭 工厂方法 Factory Method Factory基类,提供了一个纯虚函数(创建产品),定义派生类(具体产品的工厂)负责创建对应的产品,可以做到不同的产品,在不同的工厂里面创建,能够对现有工厂,以及产品的修改关闭 实际上,很多产品是有关联关系的,属于一个产品簇,不应该放在不同的工厂里面去创建,这样一是不符合实际的产品对象创建逻辑,二是工厂类太多了,不好维护 抽象工厂 Abstract Factory 把有关联关系的,属于一个产品簇的所有产品创建的接口函数,放在一个抽象工厂里面AbstractFactory,派生类(具体产品的工厂)应该负责创建该产品簇里面所有的产品

工厂模式:主要是封装了对象的创建

简单工厂:

class Car
{
public:
	Car(string name) : _name(name) {}
	virtual void show() = 0;
protected:
	string _name;
};

class BMW : public Car
{
public:
	BMW(string name) : Car(name) {}
	void show()
	{
		cout << "获取了一辆宝马汽车:" << _name << endl;
	}
};

class Audi : public Car
{
public:
	Audi(string name) : Car(name) {}
	void show()
	{
		cout << "获取了一辆奥迪汽车:" << _name << endl;
	}
};

enum CarType
{
	eBMW,eAUDI
};
class SimpleFactory
{
public:
	Car *createCar(CarType ct)
	{
		switch (ct)
		{
		case eBMW:
			return new BMW("X1");
		case eAUDI:
			return new Audi("A6");
		default:
			cerr << "传入工厂的参数不正确:" << ct << endl;
			break;
		}
		return nullptr;
	}
};

int main()
{
	//Car *p1 = new BMW("X1");
	//Car *p2 = new Audi("A6");
	unique_ptr<SimpleFactory> factory(new SimpleFactory());
	unique_ptr<Car> p1(factory->createCar(eBMW));
	unique_ptr<Car> p2(factory->createCar(eAUDI));
	p1->show();
	p2->show();

	return 0;
}

工厂方法:

class Car
{
public:
	Car(string name) : _name(name) {}
	virtual void show() = 0;
protected:
	string _name;
};

class BMW : public Car
{
public:
	BMW(string name) : Car(name) {}
	void show()
	{
		cout << "获取了一辆宝马汽车:" << _name << endl;
	}
};

class Audi : public Car
{
public:
	Audi(string name) : Car(name) {}
	void show()
	{
		cout << "获取了一辆奥迪汽车:" << _name << endl;
	}
};
//符合开闭原则
class Factory
{
public:
	virtual Car *createCar(string name) = 0;//工厂方法
};

class BMWFactory : public Factory
{
public:
	Car* createCar(string name)
	{
		return new BMW(name);
	}
};

class AudiFactory : public Factory
{
public:
	Car* createCar(string name)
	{
		return new Audi(name);
	}
};

int main()
{
	unique_ptr<Factory> bmwfty(new BMWFactory());
	unique_ptr<Factory> audifty(new AudiFactory());

	unique_ptr<Car> p1(bmwfty->createCar("X6"));
	unique_ptr<Car> p2(audifty->createCar("A8"));
	p1->show();
	p2->show();

	return 0;
}