使用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给出的定义为:建造者模式是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 应用场景 使用建造者模式是为了将构建复杂对象的过程和它的部件 ...
随机推荐
- 【Python】如何基于Python写一个TCP反向连接后门
首发安全客 如何基于Python写一个TCP反向连接后门 https://www.anquanke.com/post/id/92401 0x0 介绍 在Linux系统做未授权测试,我们须准备一个安全的 ...
- Linux 串口、usb转串口驱动分析(2-2) 【转】
转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=26807463&id=4186852 Linux 串口.usb转 ...
- Gitlab的安装汉化及问题解决
Gitlab的安装汉化及问题解决(2017/12/14目前版本为10.2.4) 一.前言 Gitlab需要安装的包太TM多了,源码安装能愁死个人,一直出错,后来发现几行命令就装的真是遇到的新大陆一样. ...
- retrying模块的学习
retrying模块的学习 我们在写爬虫的过程中,经常遇到爬取失败的情况,这个时候我们一般会通过try块去进行重试,但是每次都写那么一堆try块,真的是太麻烦,所以今天就来说一个比较pythonic的 ...
- 用一句SQL查询相对复杂的统计报表
--统计从2017年3月份开始每个月金融服务支付前分期申请数以及通过(核账完成)数 ,ApplyTime)) ,ApplyTime)) as varchar)+'月' as 日期,count(*) a ...
- ubuntu 12.04网络配置之设置静态iP
step: 1.输入命令: sudo vi /etc/network/interfaces 看到如下内容: 2.追加以下内容: iface eth0 inet static address 192.1 ...
- 打造一款便携版的Sublime Text
https://segmentfault.com/a/1190000000707661 https://www.cnblogs.com/52cik/p/sublime-diy.html 直接安装Sub ...
- django中的view测试和models测试样例
感觉用model_mommy比factory_boy要好些. 如果Models.py如下: from django.db import models from django.contrib.auth. ...
- 【LOJ】#2109. 「JLOI2015」骗我呢
题解 我深思熟虑许久才算是明白个大概的计数问题吧 先是转化成一个矩形,列一条直线y = x,y = x - (m + 1)我们从(0,0)走到(n + m + 1,m + 1)就是答案 因为我们起始相 ...
- C++Primer,C++标准IO库阅读心得
IO 标准库类型和头文件 iostream istream 从流中读取 ostream 写到流中去 iostream 对流进行读写:从 istream 和 ostream 派生而来fstream if ...