简单工厂模式

优势

  1. 一个调用者想创建一个对象,只要知道其名称就可以了;
  2. 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以;
  3. 屏蔽产品的具体实现,调用者只关心产品的接口。
1
2
3
4
5
6
7
8
9
10
11
12
13
class Factory
{
public:
Factory() {}
virtual ~Factory() { std::cout << "~Factory" << std::endl; }
// This virtual is very important
// If you don't have this virtual, try this code
// Factory *f = new ComputerFactory;
// delete f;
// ComputerFactory's destructor will not be called, causing a memory leak

virtual void name() { std::cout << "Factory" << std::endl; }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class ComputerFactory : public Factory
{
public:
ComputerFactory()
: Factory()
{}
virtual ~ComputerFactory() { std::cout << "~ComputerFactory" << std::endl; }

virtual void name() { std::cout << "ComputerFactory" << std::endl; }
};

class PhoneFactory : public Factory
{
public:
PhoneFactory()
: Factory()
{}
virtual ~PhoneFactory() { std::cout << "~PhoneFactory" << std::endl; }

virtual void name() { std::cout << "PhoneFactory" << std::endl; }
};

创建工厂的方法

1
2
3
4
5
6
7
8
9
10
11
enum FactoryType { Computer, Phone };

Factory *createFactory(FactoryType type)
{
switch (type) {
case Computer: return new ComputerFactory;
case Phone: return new PhoneFactory;
default: break;
}
return new Factory;
}

测试

1
2
3
4
5
6
7
8
int main(int argc, char *argv[])
{
std::unique_ptr<Factory> f(createFactory(FactoryType::Computer));
std::unique_ptr<Factory> f1(createFactory(FactoryType::Phone));
std::unique_ptr<Factory> f2(createFactory(FactoryType(-1)));

return 0;
}

结果

1
2
3
4
5
~Factory
~PhoneFactory
~Factory
~ComputerFactory
~Factory

Factory源码