设计模式-工厂方法总结

	*要学习某个设计模式,首先要了解该设计模式是为了解决一个什么样的问题,
	在现实中应用场景是什么,才能达到事半功倍的效果。 --Sepmay*

在实际生活中,工厂方法是为了解决这样的问题:软件系统中,经常面临着创建对象的工作,由于需求的不断变化,需要创建的对象的具体类型也会经常产生变化。那么如何去应对这种变化,使得代码的复用性较好,更改的地方尽可能的少,以应对需求的灵活变化就显得很重要。
本文谈论的工厂方法便可以满足这个需求。
接下来进入一个案例:比如有一个零件加工厂,它一直负责加工零件A,那么可以写出一下的代码。

class A {
public:
	void Produce ()
	{
		cout<<"生产A产品..."<<endl;
	}
};
class Employee{
public:
	void result()
	{
		A* product = new A();
		product->Produce();
	}
};
int main()
{
	Employee worker = Employee();
	worker.result();
return 0;
}

这样便可以实现生产A零件,那如果因业务变化,不生产A改为生产B零件,相信也可以仿照上面实现。再假设一种情况,两种都生产,并且又加入了C、D、E、F等等零件生产,想要实现该生产哪种就生产哪种,那么这个时候去按照上面设计,会发现重复的部分很多,代码的复用性较低,不是一个好的办法。观察上面代码A* product = new A();
是否可以将A对象抽象成一个抽象类,实现生产哪个零件,我们就创建哪个零件对象呢?当然可以,这就是我们要介绍的工厂方法。
代码如下:

class Product{
public:
	virtual void Produce() =0;
	virtual ~Product() {}
};

class A : public Product{
public:
	virtual void Produce()
	{
		cout<<"生产A产品..."<<endl;
	}
};

class B : public Product {
public:
	virtual void Produce()
	{
		cout<<"生产B产品..."<<endl;
	}
};

class Factory{
public:
	virtual Product* CreateProduct() = 0;
	virtual ~Factory() {} 
};

class AFactory : public Factory{
public:
	virtual Product* CreateProduct()
	{
		return new A();
	}
};

class BFactory : public Factory{
public:
	virtual Product* CreateProduct()
	{
		return new B();
	}
};

class Employee{
private:
	Factory *fac;
public:
	Employee(Factory * fac)
	{
		this->fac = fac;
	}
	void Result()
	{
		Product* product = fac->CreateProduct();
		product->Produce();
	}
};

int main()
{
	Employee worker1 = Employee(new AFactory());
	worker1.Result();
	Employee worker2 = Employee(new BFactory());
	worker2.Result();
	return 0;
}

结构图:
在这里插入图片描述

通过工厂方法可以将零件对象抽象出来,将生产各个零件的工厂也抽象出来,那么便可以是实现通过“对象创建”绕开“new”,避免new对象创建导致的紧耦合–依赖具体的类,实现松耦合,从而支持对象创建的稳定。

总结:定义了一个用于创建对象的接口,让子类可以实例化具体的哪一个类。
Factory Method**使得一个类的实例化延迟到子类**,目的是为了**解耦**,
实现的手段是**虚函数的多态性**。

此外本文中的一些其他知识点:
base类中析构函数为什么使用虚函数可以查看我的另外一篇文章:添加链接描述

关于抽象工厂可以查看我的另外一篇文章。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值