xhliu 的个人资料青蛙王子的工作空间照片日志列表 工具 帮助

日志


12月20日

设计模式:Abstract Factory和Builder

如果说 Factory和Prototype是同一个层次的话,那么Abstract Factory和Builder就是更高一级的层次。
 
1 Abstact Factory
   在上面的Factory类型中,我们发现如果种类变了,我们还是要修改我们的代码: Factory = new 宝马工厂。 这样的代码可能出现在很多的地方,改起来并不是很方面。那么怎么办呢? 我们能不能把修改集中在一个地方?答案是可以的,那就是Abstract Factory。我们专门生成一个类来管理工厂,把 Factory = new 宝马工厂 这句话放到他的入口里面。
 
class AbstractFactory
{
protected:
     AbstractFactory():_instance(0){}
public:
    virtual Factory* CreateCarFactory()
    {
        if(0 == _instance)
        {
             _instance = new 宝马工厂。
        }
        return _instance;
    }
private:
    Factory* _instance;
}
上面的代码实现了一个简单的singleton的Abstract Factory。这样,如果下次用户需要一个新的工厂,那么可以从这个AbstractFactory里面派生一个新的类,或者修改代码等等。
 
这时候,有人要问了,这种操作我们直接用Factory也可以实现阿,直接把原来 宝马工厂 的实现修改不就行了么? 当然可以,但是Abstract Factory的存在价值是 他可以支持更复杂的创建。比如一个军工厂,他生产轿车,飞机,坦克等等。其中的轿车就是我们上面说的轿车,也有很多自己的。我们就可以为军工厂实现一个自己的Abstract Factory.
 
class AbstractFactory
{
 public:
    virtual CarFactory* CreateCarFactory();
    virtual TankFactory* CreateTankFactory();
    virtual PlaneFactory* CreatePlaneFactory();
}
 
可以看出,一个Abstract Factory的价值在于它可以创建更多的工厂类。当然,他也可以创建具体的实例,prototype类,等等,甚至可以创建一个新的子AbstractFactory。 所以Abstract Factory类似一个总的管理者,管理的是各个实例的工厂。正因为如此,一个程序里面的Abstract Factory往往是singleton的。
 
 
2. builder
builder 也是一个高层建筑,但是他和Abstract Factory侧重点不同,Abstract Factory侧重于创建东西的结果,而builder侧重的是创建东西的过程。
 
class CarBuilder
{
public:
  virtual void Setwheel();
  virtual void SetMoto();
  virtual void SetSeat();
 
   virtual Car* GetCar();
}
 
在调用的时候采用
 
Car* CreateCar(CarBuilder& cb)
{
   cb.SetWheel(轮子);
   cb.SetMoto(马达);
   cb.SetSeat(作为);
   return cb.GetCar();
}
 
上面的例子可以看出builder的特征。

评论

请稍候...
很抱歉,您输入的评论太长。请缩短您的评论。
您没有输入任何内容,请重试。
很抱歉,我们当前无法添加您的评论。请稍后重试。
若要添加评论,需要您的家长授予您相应权限。请求权限
您的家长禁用了评论功能。
很抱歉,我们当前无法删除您的评论。请稍后重试。
您已超过了一天之内允许提供的评论数上限。请在 24 小时后重试。
因为我们的系统表明您可能在向其他用户提供垃圾评论,您的帐户已禁用了评论功能。如果您认为我们错误地禁用了您的帐户,请联系 Windows Live 支持部门
完成下面的安全检查,您提供评论的过程才能完成。
您在安全检查中键入的字符必须与图片或音频中的字符一致。

若要添加评论,请使用您的 Windows Live ID 登录(如果您使用过 Hotmail、Messenger 或 Xbox LIVE,您就拥有 Windows Live ID)。登录


还没有 Windows Live ID 吗?请注册

引用通告

此日志的引用通告 URL 是:
http://flyingfrog1980.spaces.live.com/blog/cns!515A924507F2FEA5!136.trak
引用此项的网络日志