设计模式:Abstract Factory和Builder(比较区别,个人认为讲得很明白)
2007-04-17 10:59
465 查看
如果说 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的特征。
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的特征。
相关文章推荐
- 设计模式:Abstract Factory和Builder(比较区别,个人认为讲得很明白)
- 设计模式-简单工厂(1,简单继承,用来比较与工厂模式的区别)
- 设计模式之Builder (创建者模式)的一些个人理解(转)
- TCP协议与UDP协议的区别,个人认为比较容易懂
- 什么是框架 架构 设计模式 比较 对比 区别
- 桥接模式与其它几种相近的设计模式之间的区别与比较
- 设计模式(4)-创建型-建造者(Builder)(个人笔记)
- 设计模式: Builder 建造者模式
- 设计模式之Builder——购机篇
- c++设计模式之四:Builder Pattern
- 23种设计模式-3.建造者模式(Builder)
- 设计模式实例解析-创建型模式(Singleton、Abstract Factory、Builder)[转]
- 设计模式之桥梁模式和策略模式的区别
- 四种很相似的设计模式(State,Strategy,Bridge,Visitor)的区别
- Builder设计模式
- 设计模式(c++)笔记之四(Builder 模式)
- (六)二十三中设计模式之我见------------建造者模式或生成器模式(Builder Pattern)
- 设计模式(3) –建造者模式(Builder)
- 设计模式(2)--java动态代理及jdk和cglib的区别
- 设计模式-单例模式(Singleton)各种写法和分析比较