工厂模式

工厂模式主要用于有很多类时,主要封装了对象的创建。

简单工厂 :把对象的创建封装在一个接口函数中,通过传入标识,返回创建的对象,不用了解对象创建的过程

一个工厂不能生产很多种类的汽车,不符合开闭原则。

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 << "BMW" << _name << endl;
	}
};

class AUDI :public car
{
public:
	AUDI(string name) :car(name) {}

	void show()
	{
		cout << "AUDI" << _name << endl;
	}
};

enum carType {
	audi,bmw
};

class simplyfactory
{
public:
	car* createcar(carType ct)
	{
		switch (ct)
		{
		case bmw:
			return new BMW("x5");
		case audi:
			return new AUDI("a8");
		default:
			cout << "errror" << endl;
			break;
		}
		return nullptr;
	}
};

int main()
{
	simplyfactory * fac = new simplyfactory();

	car* p1 = fac->createcar(bmw);
	car* p2 = fac->createcar(audi);

	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 << "BMW" << _name << endl;
	}
};

class AUDI :public car
{
public:
	AUDI(string name) :car(name) {}

	void show()
	{
		cout << "AUDI" << _name << endl;
	}
};

enum carType {
	audi,bmw
};

class simplyfactory
{
public:
	virtual car* createcar(string name) = 0;
};

class bmwfactory :public simplyfactory
{
public:
	car* createcar(string name)
	{
		return new BMW(name);
	}
};

int main()
{
	unique_ptr<simplyfactory> bmwfac(new bmwfactory());
	unique_ptr<car> p1(bmwfac->createcar("fll"));
	p1->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 << "BMW" << _name << endl;
	}
};

class AUDI :public car
{
public:
	AUDI(string name) :car(name) {}

	void show()
	{
		cout << "AUDI" << _name << endl;
	}
};

class light
{
public:
	virtual void show() = 0;
};

class bmwlight:public light
{
public:
	void show() { cout << "bmw light" << endl; }
};
class audilight :public light
{
public:
	void show() { cout << "audi light" << endl; }
};

enum carType {
	audi,bmw
};

class absfactory
{
public:
	virtual car* createcar(string name) = 0;
	virtual light* createlight() = 0;
};

class bmwfactory :public absfactory
{
public:
	car* createcar(string name)
	{
		return new BMW(name);
	}
	light* createlight()
	{
		return new bmwlight();
	}
};

int main()
{
	unique_ptr<absfactory> bmwfac(new bmwfactory());
	unique_ptr<car> p1(bmwfac->createcar("fll"));
	unique_ptr<light> p2(bmwfac->createlight());
	p1->show();
	p2->show();

	return 0;
}

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值