*要学习某个设计模式,首先要了解该设计模式是为了解决一个什么样的问题,
在现实中应用场景是什么,才能达到事半功倍的效果。 --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类中析构函数为什么使用虚函数可以查看我的另外一篇文章:添加链接描述
关于抽象工厂可以查看我的另外一篇文章。