一、前言
最近北上广的房价蹭蹭的往上涨,如果你不买房房价再高和你一点毛关系都没有;但是大多数的人还是要面临买房子的。
北上广IT创业比重还是相当高的,所以众多的程序员面临着贵如天价的房子,有苦说不出。
无论房价怎么的涨,无论房价怎么的高,我们写程序的要笑对生活;要热爱工作,热爱人民,热爱社会主义,始终拥护党的领导!
或许,青春已不再,梦想仍遥远,自己却被一线城市昂贵的生活成本压得喘不过气来。"逃离北上广"早已成为了一种社会现象,但是每年仍然还有成千上万的人来到这些大城市。
扯房子扯的有点远了,我们下面回归今天的重点-建造者模式。
二、基本概念
建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式又可以称为生成器模式。
建造者模式包含四个角色:产品角色,抽象建造者角色,具体建造者角色,指挥者角色
汽车示例:
很好理解,比如书上说的汽车例子,汽车是一个复杂的对象,它包括车轮、方向盘、发送机等各种部件。不同的车有不同的配置,而对于我们而言,仅需一辆汽车,无须知道哪些部件组成的。
可以通过建造者模式对其进行设计与描述,建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。
用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节。
但是如果你在上海有车也牛逼不了,你必须要有上海的车牌,想要有上海的车牌必须要有至少8万元人民币,有了这钱你也不一定能拍到车牌(这是多少有钱人的痛)!有上海的车牌你也未必比骑自行车去上班的先到公司。哈哈。又扯远了。
肯德基套餐示例:
建造者模式可以用于描述KFC如何创建套餐:套餐是一个复杂对象,它一般包含主食(如汉堡、鸡肉卷等)和饮料(如果汁、 可乐等)等组成部分,不同的套餐有不同的组成部分,而KFC的服务员可以根据顾客的要求,一步一步装配这些组成部分,构造一份完整的套餐,然后返回给顾客。
如果还不理解,我给你细说一个程序员面对北上广高房价如何应对的例子你就理解了。
三、代码示例
示例代码如下:
//产品角色:房子 public class House { //房子由多个房间组成 IList<string> _rooms = new List<string>(); //添加房间 public void AddRoom(string room) { _rooms.Add(room); } //返回所有的房间 public void GetRooms() { Console.WriteLine("房子户型:"); foreach (var room in _rooms) { Console.WriteLine(room); } } } //抽象建造者:建房子 public abstract class BuildHouse { //房子要满足基本的:吃、喝、拉、撒、睡 //厨房 public abstract void BuildCitchen(); //卫生间 public abstract void BuildBathroom(); //卧室 public abstract void BuildBedroom(); //客厅 public abstract void BuildLingingroom(); //返回房子 public abstract House GetHouse(); } //具体建造者:农村自建 450平4室2厅2卫1厨2层别墅 造价20万 public class CountyHouse : BuildHouse { private readonly House _house = new House(); //厨房 public override void BuildCitchen() { _house.AddRoom("50平超大厨房"); } //卫生间 public override void BuildBathroom() { _house.AddRoom("50平超大卫生间1"); _house.AddRoom("50平超大卫生间2"); } //卧室 public override void BuildBedroom() { _house.AddRoom("50平超大卧室1"); _house.AddRoom("50平超大卧室2"); _house.AddRoom("50平超大卧室3"); _house.AddRoom("50平超大卧室4"); } //客厅 public override void BuildLingingroom() { _house.AddRoom("50平超大客厅1"); _house.AddRoom("50平超大客厅2"); } //返回房子 public override House GetHouse() { return _house; } } //具体建造者:北上广深购买 60平1室1厅1厨1卫 平均4万一平也要240万 public class CityHouse : BuildHouse { private readonly House _house = new House(); //厨房 public override void BuildCitchen() { _house.AddRoom("10平厨房"); } //卫生间 public override void BuildBathroom() { _house.AddRoom("10平卫生间"); } //卧室 public override void BuildBedroom() { _house.AddRoom("20平卧室"); } //客厅 public override void BuildLingingroom() { _house.AddRoom("20平客厅"); } //返回房子 public override House GetHouse() { return _house; } } //指挥者角色:指挥房子建造过程 public class Director { public void Builder(BuildHouse house) { house.BuildCitchen(); house.BuildBathroom(); house.BuildBedroom(); house.BuildLingingroom(); } }
客户端调用代码:
static void Main(string[] args) { //实例化指挥者 Director director=new Director(); //实例化农村建别墅 CountyHouse countyHouse=new CountyHouse(); director.Builder(countyHouse); House house = countyHouse.GetHouse(); house.GetRooms(); //实例化北上广深购买 CityHouse cityHouse = new CityHouse(); director.Builder(cityHouse); House house1 = cityHouse.GetHouse(); house1.GetRooms(); Console.ReadKey(); }
运行效果:
房子是一个复杂对象,它要保证人的基本生活吃喝拉撒睡,一般包括卧室、厨房、卫生间、客厅等房间组成部分,不同的房子有不同的组成部分(例如一室户小户型,三室大户型),而房地产开发商可以装配出各种户型满足不同人的需求,然后高价卖给人民。
四、总结
1、客户端只关注需要的产品,不需要产品的具体内部组成。
2、客户端可以根据不同的具体创建者获得不同的产品。
3、和抽象工厂相比,建造者模式返回完整的产品实例;抽象工厂是返回一系列相关产品
【比如MSSQL的CURD和 MongoDB 的CURD;装修时家用电器是用格里(洗衣机,电视,空调,电冰箱……)的还是用海尔洗衣机,电视,空调,电冰箱……】
4、抽象工厂模式可以理解为是创建的具体家用电器(洗衣机,电视,空调,电冰箱……),建造者模式是创建的电器品牌的实例(格里,海尔)
示例代码下载:https://yunpan.cn/cYWPthPAWtVgd (提取码:2cac)