设计模式之C++实现 - 工厂模式

原创 2007年09月19日 08:45:00

设计模式之C++实现 - 工厂模式

1 工厂

现实中的工厂是用来生产实际物体的,类似的,面向对象程序开发中的工厂是产生对象的。在开发中使用工厂时,只要写出要求工厂产生一个对象实例的代码即可,而无需直接构造对象实例。例如,在一个室内装饰软件中或许有个FurnitureFactory对象,当代码需要产生一些桌子时,可以通过调用FurnitureFactory中的createTable()方法来产生一些桌子。

乍眼一看,工厂好像只会带来开发的复杂性而没有明显的好处,但它可以在大批量的产生对象时有用。(--规模化生产?)另外一个好处是在构建对象时无需关心对象对应的确切的类。下面是一个例子。

在真实世界中,当说到开车时,不会具体的指是哪种车,可以是宝马或者吉利,只要能开就行。现在假设你要辆车且经济上可以负担,通常是工厂有什么车生产出来,你就可以买到哪种车。在程序开发中也类似,首先需要一个可以开的车,一个多义性的车。你可以写一个抽象类Car,里面有drive()方法。那么,宝马或者吉利就是它的子类。当然,如果需要直到最后要到的车是宝马还是吉利需要在创建car对象的时候就明确。

如果是采用car 工厂的办法,,CarFactory的超类会定义个buildCar()虚拟的方法。BMWFactory和GeliFactory的子类会重载buildCar方法来创建宝马和吉利。

采用工厂的方法可以抽象对象产生的过程,你可以很容易的替换不同的工厂。就像利用多义性创建对象一样,同样可以利用多义性创建工厂。这样做可以很容易的扩展程序--只需更换工厂实例。

工厂的实现

首先需要实现车的类

/**
* Car.h
*
*/

#include <iostream>

class Car
{
public:
virtual void info() = 0;
};

class Geli : public Car
{
public:
virtual void info() { std::cout << "Geli" << std::endl; }
};

class BMW: public Car
{
public:
virtual void info() { std::cout << "BMW" << std::endl; }
};

接下来实现CarFactory的类,其中子类重载了createCar()以返回特定的车
/**
* CarFactory.h
*/


#include "Car.h"

class CarFactory
{
public:
CarFactory();

Car* requestCar();

int getNumCarsInProduction() const;

protected:
virtual Car* createCar() = 0;

private:
int mNumCarsInProduction;
};

class BMWFactory : public CarFactory
{
protected:
virtual Car* createCar();
};

class GeliFactory : public CarFactory
{
protected:
virtual Car* createCar();
};

最后实现CarFactory

/**
* CarFactory.cpp
*/

#include "CarFactory.h"

// Initialize the count to zero when the factory is created.
CarFactory::CarFactory() : mNumCarsInProduction(0) {}

// Increment the number of cars in production and return the
// new car.
Car* CarFactory::requestCar()
{
mNumCarsInProduction++;
return createCar();
}

int CarFactory::getNumCarsInProduction() const
{
return mNumCarsInProduction;
}

Car* BMWFactory::createCar()
{
return new BMW();
}

Car* GeliFactory::createCar()
{
return new Geli();
}

使用CarFactory

最简单的办法就是实例化并调用正确的方法,例如

GeliFactory myFactory;

Car* myCar = myFactory.requestCar();

一个有意思的例子是使用虚拟构造器(vitual Constructor)来建立一个产量最小的工厂。这需要一个函数来检查各个工厂并且选择最闲的一个。例如:

CarFactory* getLeastBusyFactory(const vector<CarFactory*>& inFactories)
{
if (inFactories.size() == 0) return NULL;

CarFactory* bestSoFar = inFactories[0];


for (size_t i = 1; i < inFactories.size(); i++)
   {
     if (inFactories->getNumCarsInProduction() <
     bestSoFar->getNumCarsInProduction()) {
   bestSoFar = inFactories;
     }
   }

return bestSoFar;
}

以下代码将会利用上面的函数在最闲的工厂生产10辆车。

int main(int argc, char** argv)
{
vector<CarFactory*> factories;

// Create 3 Ford factories and 1 Toyota factory.
BMWFactory* factory1 = new BMWFactory();
BMWFactory* factory2 = new BMWFactory();
BMWFactory* factory3 = new BMWFactory();
GeliFactory* factory4 = new GeliFactory();

// To get more interesting results, pre-preorder some cars.
factory1->requestCar();
factory1->requestCar();
factory2->requestCar();
factory4->requestCar();

// Add the factories to a vector.
factories.push_back(factory1);
factories.push_back(factory2);
factories.push_back(factory3);
factories.push_back(factory4);

// Build 10 cars from the least busy factory.
for (int i = 0; i < 10; i++) {
   CarFactory* currentFactory = getLeastBusyFactory(factories);
   Car* theCar = currentFactory->requestCar();
   theCar->info();
}
}
 

相关文章推荐

设计模式 - 抽象工厂模式(Abstract Factory) C++实现

抽象工厂模式(Abstract Factory) 意图:提供一个创建一系列相关或相互依赖对象的接口。 之前的工厂方法模式,每增加一个产品,就需要增加一个具体产品类和一个对于工厂类。 对于一些情况...

简单工厂模式的C++实现——设计模式学习(1)

本文给出了分别使用面向过程思想和面向对象思想实现的计算机简单例子,其中运用面向对象思想实现的计算器例子,不仅运用面向对象的封装、继承、多态三大特性将业务逻辑和界面逻辑加以分离,还增加了异常处理,以及运...
  • Fan0920
  • Fan0920
  • 2016年11月22日 14:56
  • 235

C++设计模式实现--工厂模式

一、简单工厂         概述:                 简单工厂模式又称为静态工厂方法(Static Factory Method)模式,属于类的创建型模式,通常根据一个条件(参数)...

设计模式C++实现(1)——工厂模式

软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最...

设计模式C++实现(1)——工厂模式

分类: 软件设计模式c++实现 2011-08-11 08:34 54人阅读 评论(0) 收藏 举报  软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式...

C++实现设计模式之——工厂模式

适用范围: 需要创建大量不同对象,并且需要集中管理。例如你要买一辆汽车,你不必关心汽车的构造,以及汽车的创建过程,你只关心,你付钱给厂商,提需求,我需要一辆Golf,然后就是等待厂商交付车。汽车的零...

设计模式C++实现一:简单工厂模式

参考大话设计模式和网上的一些资料,自己编写下一些简单的设计模式,让自己了解这些设计模式的妙处!...

设计模式C++实现十一:抽象工厂模式

抽象工厂模式(Abstract Factory):提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的类。 优点:便于交换产品系统,由于具体工厂类,在一个应用中只需要初始化的时候出现一...

设计模式C++实现——抽象工厂模式

模式定义:         抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。         抽象工厂允许客户使用抽象的接口来创建一组相关产品,而不需要知道实际产出...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式之C++实现 - 工厂模式
举报原因:
原因补充:

(最多只允许输入30个字)