登陆注册
8183300000106

第106章 7 汽车制造

大B:“就我刚才跟你讲的汽车制造作为例子。现在我再用图形和代码具体和你讲讲。”

namespace Builder

……{

//车身

public class Body

……{

private string name;

public string Name

……{

get……{return name;}

set……{name=value;}

}

public Body(string name)

……{

this。name=name;

}

}

//引擎

public class Engine

……{

private string name;

public string Name

……{

get……{return name;}

set……{name=value;}

}

public Engine(string name)

……{

this。name=name;

}

}

//车轮

public class Wheel

……{

private string name;

public string Name

……{

get……{return name;}

set……{name=value;}

}

public Wheel(string name)

……{

this。name=name;

}

}

//Benz汽车

public class Benz

{

private Body body;

private Engine engine;

private IList《Wheel》wheels;

public void AddBody(Body body)

{

this。body=body;

}

public void AddEngine(Engine engine)

{

this。engine=engine;

}

public void AddWheel(Wheel wheel)

{

if(wheels……null)

{

wheels=new List《Wheel》();

}

wheels。Add(wheel);

}

public void ShowMe()

{

if((this。body……null)||(this。engine……null)||(wheels……null))

{

Console。WriteLine(“This car has NOT been completed yet!”);

}

Else

{

Console。WriteLine(“This is a car with a” body。Name “and a” engine。Name );

Console。WriteLine(“This car contains” wheels。Count wheels:);

for(int i=0;i<wheels。Count;i )

{

Wheel wheel=wheels[i];

Console。WriteLine(wheel。Name);

}

}

}

}

//汽车制造厂抽象定义

public abstract class CarBuilder

{

public virtual void BuildBody(){;}//生产车身

public virtual void BuildEngine(){;}//生产引擎

public virtual void BuildWheel(string name){;}//生产车轮

}

//Benz汽车制造厂

public class BenzBuilder:CarBuilder

{

private Benz car;

public override void BuildBody()

{

car=new Car();

car。AddBody(new Body(“business car body”));

}

public override void BuildEngine()

{

car。AddEngine(new Engine(“benz engine”));

}

public override void BuildWheel(string name)

{

car。AddWheel(new Wheel(name));

}

//生产汽车,Benz汽车装配过程

public Benz GetCar()

{

//do something like to assemble body and engine together。

return car;

}

}

//汽车经销商

public class Producer

{

private CarBuilder builder;

public Producer(CarBuilder builder)

{

this。builder=builder;

}

public Car Construct()

{

builder。BuildBody();

builder。BuildEngine();

builder。BuildWheel(“front left”);

builder。BuildWheel(“front right”);

builder。BuildWheel(“back left”);

builder。BuildWheel(“back right”);

}

}

//客户端程序

public class Client

{

static void Main(string[]args)

{

BenzBuilder builder=new BenzCarBuilder();

Producer director=new Producer(builder);

director。Construct();

Benz car=builder。GetCar();

car。ShowMe();

}

}

}

小A:“这种类结构的设计,有什么好处呢?假设我们现在不想要刚才订的奔驰汽车了,而是想换成一辆路虎越野车怎么办?”

大B:“我们只需要告诉经销商,我们想改变汽车制造商就可以了!”

在上面的程序结构中,我们需要做的是:

1、定义一个路虎汽车及其制造商,实现制造车身、引擎、轮胎和组装的方法:

//Benz汽车

public class Benz

{

private Body body;

private Engine engine;

private IList《Wheel》wheels;

//……以下省略

}

public class LandRoverBuilder:CarBuilder

{

private LandRover car;

public override void BuildBody()

{

car=new Car();

car。AddBody(new Body(“business car body”));

}

public override void BuildEngine()

{

car。AddEngine(new Engine(“benz engine”));

}

public override void BuildWheel(string name)

{

car。AddWheel(new Wheel(name));

}

//生产汽车,LandRover汽车装配过程

public LandRover GetCar()

{

//do something like to assemble body and engine together。

return car;

}

}

2、修改客户端调用,把LandRoverBuilder提供给Producer:

LandRoverBuilder builder=new LandRoverCarBuilder();

Producer director=new Producer(builder);

director。Construct();

LandRover car=builder。GetCar();

car。ShowMe();

OK,你就得到一辆路虎了!这就是GoF说的“将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示”的含义!用同样的方式,你甚至可以得到一辆拖拉机!

大B:“让我们来稍微扩展一下思路,讨论一下扩展问题。我们注意到,在产品这个层次上,每个制造厂直接依赖于具体的汽车,如BenzBuilder生成Benz,在客户端使用时也必须依赖于具体的汽车制造厂BenzBuilder和具体汽车Benz,在抽象制造厂CarBuilder定义中也没有包含GetCar的定义。”

小A:“这是为什么呢?”

大B:“我们想想把Benz这个汽车这个产品也抽象化,定义为Car,具体汽车Benz和LandRover从Car继承,在CarBuider中定义GetCar方法依赖于抽象Car,从而在客户端也可以依赖于抽象。”

CarBuilder builder=new LandRoverCarBuilder();

roducer director=new Producer(builder);

irector。Construct();

Car car=builder。GetCar();

car。ShowMe();

大B:“这种做法没错,你把这个结构图画出来就可以看出,这就成了一个典型的工厂模式!实际上,工厂模式和生成器模式是经常引起混淆和困扰的模式,不过仔细体会两种模式的意图就可以发现,他们关注的重点不同。工厂模式的重点在于产品的系列化的生成问题:工厂方法模式解决一种产品细节差异,抽象工厂模式解决多种产品的系列化创建――这些产品可以很简单,也可以比较复杂。但是,这些产品都是整体创建的。而生成器模式关注的是复杂产品的创建细节――如何一步一步的完成复杂产品部件的创建和最后的组装过程。这个创建复杂产品的过程可以差距巨大,所装配出来的产品也可以差距巨大。比如,上面的CarBuilder定义的抽象过程,只要进行合适的扩充,Producer通过使用具体的生成器就可以生产出小汽车、越野车、赛车、拖拉机,甚至任何由车身、引擎和轮胎可以组合出来的产品!正是由于这些产品之间的差异如此巨大,因此无法在抽象的CarBuilder中定义一个GetProduct之类的抽象方法。我们再来看Producer这个类。它起到的是指导者的作用,指导生成器的使用方法,也就是利用生成器一步步建造出产品的过程。这个过程一般来说是固定的。通过修改Construct()方法,就可以改变产品的建造过程。当然,如果一个产品的建造过程也是系统的变化因素,当然也可以利用类似工厂模式的方法对Producer进行抽象和封装。最后我们来看看一下CarBuilder提供给Producer的方式。生成器模式的核心是给督导者一个生成器,但是具体方式并没有限定。可以像本例这样使用聚合的方式,也可以直接把CarBuilder作为参数提供给Construct方法――这并没有什么本质的区别。”

同类推荐
  • 黑客就在你身边

    黑客就在你身边

    互联网络正在改变着我们的生活,每个人都处在互联网的天罗地网之中。本书以轻松的笔调,向人们介绍了有关“黑客”的知识。当你读完这本书后,你会发觉“黑客”一点都不神秘,他们渴望全社会对他们有一个公正的评价。
  • 三维动画审美谈

    三维动画审美谈

    数字时代,美的标准充满更多的不确定性。而三维动画以数字图像形式成为这个图时代的代表。三维动画及三维图像不仅仅是由于应用了仿真数字图像技术而带来的虚拟空间,还有更多的是由三维图像技术所引发或引导的被扩展的图像技术,这些技术无不应用在现代视觉设计领域的各个方面,并且,由此引起社会的追热,引起审美观念的改变。这些改变是在进行中的,变化中的,也是在发展中的。对于未知的美,我们做的只是追寻和记录,我们不知道以后的美将会是什么样,尽管我们苦苦追寻,孜孜探讨,同时也在默默审视。我们在追寻中享受美,在探讨中认知美,在审视中体验美……
  • 中文版3dsMax2010实例与操作

    中文版3dsMax2010实例与操作

    本书结合3dsMax2010的实际用途,按照系统、实用、易学、易用的原则,通过大量案例介绍了3dsMax2010的各项功能,内容涵盖3dsMax入门、创建和编辑二维图形、创建基本三维模型、使用修改器、网格建模、多边形建模、面片建模、复合建模、材质和贴图、灯光和摄影机、渲染、动画制作、粒子系统、空间扭曲和动力学等。
  • 科学伴你行-神奇的通信技术

    科学伴你行-神奇的通信技术

    在日常生活中,有时人们要借助于小旗子来进行通信联络,比如,开运动会时,发令员常常要用小旗子与计时员联系;当你乘坐火车进入车站时,都会看到车站工作人员拿着红色和绿色的小旗子在站台上进行指挥;在战争中,打出白色旗子表示投降,插上红色旗子表明胜利;航行在茫茫大海上的船只,双方船员会凭不同旗帜组成的标志,来了解对方的意思。以上种种用小旗子来“说话”的通信方式就叫做旗语。
  • 爱上我的“手机女友”

    爱上我的“手机女友”

    本书共有五个部分:第一章:千娇百媚的我—手机门类大搜索第二章:了解我的心—手机“芯”理学第三章:不一样的我不一样的美—手机的万种风情第四章:命中注定我爱你—神秘手机星座解读第五章:有求必应贴心女友—手机的绝世武功通过这本书,想要购入手机的你会知道哪款手机女友更适合你,已有心仪手机的你可以让手机女友懂得更多变得更聪明。希望这本书能够帮助你在手机选购上和手机使用上更舒心、安心、贴心。
热门推荐
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • 韶华易逝红颜易老

    韶华易逝红颜易老

    岁月匆匆流逝,我们终将会长大,我们是否会因为生命中不得不进行的离别而落泪,是否会因为我们终将逝去的青春,终将老去的年月而落泪?
  • 魔君你不懂爱

    魔君你不懂爱

    一个是魔族太子,未来君临天下的,魔皇夜舒;一个是为天界花神月璃;仙魔之战,暗潮汹涌,黎明前夕的至暗时刻,仙界、魔界、人界的“火种”们都在各自的轨迹上努力着。
  • 白螭传

    白螭传

    遥远的嘉岗坦的山脉,巨神峰顶,远古的天狼星灵暴躁的低吼着……最强者基兰的失踪,彻底拉开了战争的序幕,凶残的诺克萨斯横扫大陆,邪恶的虚空信徒,神秘的暗影生物纷纷现世。德玛西亚的沦陷,让少年白螭何去何从?不知名强者的堕天一击,竟让他全身瘫痪!是该就此沉沦,还是与命相争?白螭该如何抉择?新人新书,请朋友们多多支持。
  • 花过香尘

    花过香尘

    这世上总有那么多些巧合如同骨牌一般,一旦在不经意间触启后,便会牵连出一桩桩是非曲折来。人总是想要把持大局,却往往了然故事的经过,最终的结局波谲云诡,却是我们始料所不及的。<一滴泪痣,宛若花骨美人:一瀑青丝,化作封喉无影>
  • 快穿之异灵师生存记

    快穿之异灵师生存记

    一觉醒来,身处末世,异能丧尸都成了现实。灾难与救赎,友谊与背叛,是希望还是浩劫,重生亦是毁灭,四个女孩该何去何从……
  • 再唱铃儿响叮当

    再唱铃儿响叮当

    将要读研的师范大学的学生苏妤玲因失恋报名到西藏当支教老师,遇到了援藏干部丁健,她们在援藏工作中志同道合,为拉萨妥巴乡的发展做出了贡献,并在工作中产生了爱情……
  • 龙阳剑圣

    龙阳剑圣

    七彩血族入侵,中州五宝出世,滔天黄沙之外的世界,深海诡异的骷髅军团,武林盟主的突然暴毙,这一切是有人操纵,还是天意,天界第一战神为何突然降临?他的到来会为中原带来机遇还是危机?
  • 鹿晗:缘来还是你

    鹿晗:缘来还是你

    不相信我,为什么不肯放过我,想保护我,我为什么允许她伤害我,爱我,为什么欺骗我,她的一生勿扰着这几个男生,纠缠不清,他是她的独家记忆,但也是伤得最深发回忆。
  • 刘放的异界

    刘放的异界

    刘放穿越了。在另一方世界,他见证了时代,也成就了一个时代。