使用Builder模式造车
Builder模式也可以造车。
对于Builder模式来说,首相要把要造的车确定下来:
public class Car{public string Model { get; set; }public string Engine { get; set; }public string Transmission { get; set; }public string Body { get; set; }public int Doors { get; set; }public List<string> Accessories { get; set; }public Car(){Accessories = new List<string>();}public void ShowCarInfo(){Console.WriteLine(Model);Console.WriteLine(Engine);Console.WriteLine(Body);Console.WriteLine("门的数量:" + Doors);Console.WriteLine(Transmission);Console.WriteLine("配置为:");foreach (var accessory in Accessories){Console.WriteLine("\t{0}", accessory);}}}
这个Car可以交给Builder1也可以交给Builder2,等等,但首先需要提炼出Builder们的一个抽象类。这个抽象Builder可以设置和获取Car,并提供生产Car各个部件的抽象方法。
public abstract class CarBuilder{protected Car _car;public Car GetCar(){return _car;}public void SetCar(){_car = new Car();}public abstract void SetModel();public abstract void SetEngine();public abstract void SetTransmission();public abstract void SetBody();public abstract void SetDoors();public abstract void SetAccessories();}
然后,就需要一个具体的Builder来派生抽象Builder。
public class BuilderOne : CarBuilder{public override void SetEngine(){_car.Engine = "发动机1";}public override void SetModel(){_car.Model = "型号1";}public override void SetTransmission(){_car.Transmission = "变速1";}public override void SetBody(){_car.Body = "SUV";}public override void SetAccessories(){_car.Accessories.Add("内饰");_car.Accessories.Add("外饰");}public override void SetDoors(){_car.Doors = 6;}}
这个抽象Builder的派生类可能有很多,所以需要一个管理这些派生Builder的类,用来决定到底选用哪个Builder来生产。
public class BuilderManager{private readonly CarBuilder _carBuilder;public BuilderManager(CarBuilder carBuilder){_carBuilder = carBuilder;}public void BuildCar(){_carBuilder.SetCar();_carBuilder.SetModel();_carBuilder.SetEngine();_carBuilder.SetBody();_carBuilder.SetDoors();_carBuilder.SetTransmission();_carBuilder.SetAccessories();}public Car GetCar(){return _carBuilder.GetCar();}}
在客户端,如果需要造车,就找Builder的管理类,通过它的构造函数传入具体的Builder。
class Program{static void Main(string[] args){var builderManager = new BuilderManager(new BuilderOne());builderManager.BuildCar();var car = builderManager.GetCar();car.ShowCarInfo();Console.ReadKey();}}
抽象工厂和Builder模式都可以造车,但两者有也许的不同:
● 抽象工厂模式相当于为车找了一个专属工厂,要求工厂只能造这种类型的车
● Builder模式相当于为车找不同的工厂,不同的工厂生产出来的车型都不一样
使用Builder模式造车的更多相关文章
- Java Builder 模式,你搞懂了么?
加油.png 前言:最近闲来无事的时候想着看看一些平常用的三方库源码,没想到看了之后才知道直接撸源码好伤身体,一般设计优秀的开源库都会涉及很多的设计模式,就比如 android 开发使用频繁的 okH ...
- Java Builder模式 体验(二)
在上篇文章中,对Java Builder模式的使用体验主要是从Builder对构造器改造方面的优秀特性来说的,感觉并没有从Java Builder模式本身的功能和作用去写,因此决定再从Build ...
- Builder模式 初体验
看来Java构造器模式,决定动手体验下.构造器模式是什么?干什么用的?推荐大家看下ITEYE的一篇文章 http://www.iteye.com/topic/71175 了解构 ...
- 设计模式之构建者(Builder)模式
在五大设计原则的基础上经过GOF(四人组)的总结,得出了23种经典设计模式,其中分为三大类:创建型(5种).结构型(7种).行为型(11种).今天对创建型中的构建者(Builder)模式的思想进行了一 ...
- 设计模式初学者笔记:Builder模式
[作者:byeyear Email:byeyear@hotmail.com 首发:cnblogs 转载请注明] 在本文的开头,先森森的鄙视下自己……将Builder模式反反复复读了七 ...
- GOF对Builder模式的定义(转载)
(1)意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. (2)适用性 1. 当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式:2. 当构造过程必须允许构 ...
- Joshua Bloch错了? ——适当改变你的Builder模式实现
注:这一系列都是小品文.它们偏重的并不是如何实现模式,而是一系列在模式实现,使用等众多方面绝对值得思考的问题.如果您仅仅希望知道一个模式该如何实现,那么整个系列都会让您失望.如果您希望更深入地了解各个 ...
- Builder模式在Java中的应用
在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成.那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Build ...
- 创建型模式之Builder模式及实现
建造者(Builder)模式 GOF给出的定义为:建造者模式是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 应用场景 使用建造者模式是为了将构建复杂对象的过程和它的部件 ...
随机推荐
- 【Windows编程】大量病毒分析报告辅助工具编写
解决重复劳动 是否在分析单个病毒时很爽,分析N个病毒写报告很机械的情况.. 1)样本下载多个文件,这些文件写报告时要加上这些文件的MD5 2)写报告时明明是17个MD5,实际样本有18个的情况.不知道 ...
- mysql Keepalived 实践
Keepalived 是一种高性能的服务器高可用或热备解决方案,Keepalived可以用来防止服务器单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发生,通过配合Nginx可 ...
- 为什么要使用断路器Hystrix?
为什么需要 Hystrix? 在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用(RPC).为了保证其高可用,单个服务又必须集群部署.由于网络原因或者自身的原因,服务并不能保证服 ...
- nginx:在centos中自启动
参考网址:http://www.jb51.net/article/120545.htm # vi /etc/init.d/nginx #!/bin/sh # Name:nginx4comex # ng ...
- C printf按8进制、10进制、16进制输出以及高位补0
; /*按整型输出,默认右对齐*/ printf("%d\n",PrintVal); /*按整型输出,补齐4位的宽度,补齐位为空格,默认右对齐*/ printf("%4d ...
- 【转载】redis容灾策略
版权声明:转载请注明出处 http://blog.csdn.net/irean_lau. https://blog.csdn.net/Irean_Lau/article/details/5136027 ...
- 墨刀 vs Axure RP
https://www.jianshu.com/p/b4b9c1f15304 墨刀https://modao.cc/ Axure RP https://www.axure.com/https://ww ...
- RGBA颜色与兼容性的半透明背景色
所谓RGBA颜色,顾名思意就是R+G+B+A的颜色,再具体点就是RED+GREEN+BLUE+ALPHA的颜色,小写一下就是red+green+blue+alpha的颜色,翻译一下就是红+绿+蓝+Al ...
- centos redis 自动重启
配置init脚本 对于Centos,有一份https://gist.github.com/1335694 经过修改,如下: ########################## PATH=/usr/l ...
- 如何快速的打开当前文件夹的dos命令窗口
一.常规方法: 1.使用 “window + R” 组合键,输入cmd回车.如下图所示: 2.如果你要定位到指定的文件夹,那么需要用cd等命令来处理.如下图所示: 二.快速方法: 按住“shift”键 ...