登陆注册
15296300000106

第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方法――这并没有什么本质的区别。”

同类推荐
  • 现代企业财务软件应用教程

    现代企业财务软件应用教程

    本书内容包括财务软件概论、系统管理、企业应用平台、总账管理、报表管理、薪资管理、固定资产管理、应收款管理、应付款管理等。
  • 中国3D打印的未来

    中国3D打印的未来

    自2012年以来,有关3D打印的报道屡见报端,这一新型制造技术引起了全世界的广泛关注。《中国3D打印的未来》作者、中国3D打印技术产业联盟秘书长罗军认为,中国从20世纪90年代初开始涉足3D打印技术,并取得了巨大进展,但与国外同行相比仍存在一定差距。特别是中国3D打印企业普遍存在“小而散”、各自为政的现象,如何发挥整合优势、抱团发展是目前亟需解决的问题。如果能够加强同行合作,抱团发展,形成合力,相信3D打印会成为唯一一项中国有可能赶超世界先进水平的技术。
  • 网络广告经纪人

    网络广告经纪人

    本书为网络广告经纪人培训认证的指定教材,该认证是商务部中国商务广告协会和信息产业部中国电子商会联合推出的,旨在为国家造就和培养出一大批网络广告梯队型人才。该教材包括网络广告经纪人的介绍和发展趋势,以及网络广告的原理、策划、设计、制作、发布与交换、效果评估、管理,以及网络广告营销的国内外最新的成功案例,还提供了一些常用的网络广告制作工具。本教材适合助理网络广告经纪人和网络广告经纪人层次使用。也可作为高校广告、电子商务等专业的教材。
  • 云计算和现代远程教育

    云计算和现代远程教育

    本书介绍了云计算知识、云计算的特性、云计算技术、云计算中的访问云、云计算中的云存储、云计算在远程教育中的应用等内容。
  • 如何组装电脑

    如何组装电脑

    本书以问答的形式介绍了组装电脑的基本知识。内容包括:电脑硬件的部件组成、CPU的发展历程、CPU主频、内存的组成、内存的主要性能参数等。
热门推荐
  • 通灵档案之阴阳眼少女

    通灵档案之阴阳眼少女

    大家好,我是花妖妖,我可以听见常人听不见的声音,看到常人看不到的东西,爷爷说我这叫通灵,另外提醒大家哦,不要因为好奇去玩什么碟仙笔仙,因为会真的惹祸上身哦,忘了说我的爷爷是个很厉害很厉害的人,跟着他我见过什么不死的僵尸,千年的冤魂等等一系列好玩的故事,且听我慢慢道来。
  • 哑与君圆南国梦

    哑与君圆南国梦

    前世:父母双亡,万贯家产被夺,亿万富少沦乞,指桑骂槐引火上身,老天爷赏了我一记闷雷。死了倒一了百了,可一切皆乃开端。转世:“妖童临世王者之家,克杀其母祸害其国,罪孽深重落地成哑,杀妖献祭保国太平”我吗?笑话。。。
  • 绿叶:我们友谊的见证

    绿叶:我们友谊的见证

    她是一个普通人,却有一天收到了校友写来的一封信,夹着一片树叶,在这片树叶中,蕴含着不少特别的东西,等他们见面后,发生了一段奇妙的事情……
  • 这一世将会不同

    这一世将会不同

    这是一个,与妖兽、神魔共存的世界。以练气之道称著
  • 天定风华IV此心倾

    天定风华IV此心倾

    她曾相遇那春日暖阳一般的男子。她曾厌憎那月华般光辉、珍珠般滑溜的男子。她只想和捡到的纨绔儿子好好过一生,调教得他开明知事,无人能及。谁知,那个纨绔而寂寞的孩子,拥有最尊贵的身份。她抚摸他鬓角的指尖,触及皇朝最高统治者的利益。搏杀之路至此开启。她欲不争而不得不争。她所想拥有的,是他人欲夺去的;她所要坚持的,是他人必打破的。她率三千军力抗敌军突袭,夺城、杀官、诈降、刺将……阻番军未进一尺,成女将无双传奇。她行最坚实强者之路,搏一场宿命的惊艳起伏。而他和他,迷离的日光和坚定的月色,谁能照亮她的前路,成就这宏大传说、无双大帝、烈火深情?
  • 黑名单之魔界兄弟情

    黑名单之魔界兄弟情

    等级划分?越级挑战?太过牵强。主角奇遇?死里逃生?太过虚假。只需要真情实意的热血,没有无脑狗血的设定。主角就是一个正常的人物,光环什么的都统统抛弃,只是用他来叙述围绕他发生的故事,展现了友情于爱情的矛盾与纠结。本书承载漫画风格,输出全靠吼。哈哈哈
  • 夏雪芬霏:别离开我

    夏雪芬霏:别离开我

    她是一个不平凡的小女孩,他是一个冰山男,当冰与火相交的时候,会发生什么有趣的事呢?她是否能找回失去的记忆呢?在她的身上到底发生过什么样的事情呢?
  • 画梦手记

    画梦手记

    程真,他的家族曾有辉煌的过去,但到了他这里,除了一贫如洗,还要时常受到噩梦折磨。花城,梦想之地,梦境之乡,无数美好和古怪故事接连发生的地方。新颖的世界观,梦术、花术、灵术相继登场,奇思妙想的法术带你领略想象力的极限。这里有美丽的爱情,不悔的青春,热血的战斗。如果愿意,请与作者一起,共同进行一次心灵的旅程。新人写新书,而且是全新的设定,可能受众并不多,但是出于热爱,还是决定写出来。如果喜欢,烦请加个收藏,给我一点鼓励。因为码字很慢,更新不会很快,但是如果真的有人愿意看,我就会稳定地更新下去。
  • 踏天

    踏天

    当信仰破灭,坚持还有用吗?背负天弃者绝体的朦朦少年身具避祸趋福的神秘能力,面对无法修炼痛苦的他被逼回老家,却在途中意外获得了天地三大根之一的阳根。回到祖祠,命运的巨手似乎围绕在他身周,冷家先辈以莫大能力逆天改命,天赐火根令他能够踏上修行。阳根,神秘能力,加上天赐火根的他修行异常迅捷。
  • 界动风云

    界动风云

    一个天赋异禀的男孩,他天性善良,有强烈的正义感,而他的一个个际遇也因此而起。他在查自己的身世的途中,实力逐步强大,成为耀眼的新星!而真正了解身世时,本想泄怒,却发现还有更加隐秘的事情未曾所闻!另外,他所见到的异于人类的种族到底是些什么生物,难道在这片异界大陆上,还有别的世界吗?(欢迎加入本人的书友群:94517842)