代码演示
我们使用代码来演示一下,使用建造者方式创建自行车
首先创建一个Bike类,给自行车提供三个属性,车篮、架子、座包
- public class Bike
- {
- public string basket { get; set; }
- public string frame { get; set; }
- public string seat { get; set; }
- }
在这里将bike实例化了,还有三个抽象方法,分别构建车篮、架子、座包,因为builder调用具体建造者来创建,具体业务我们在实现类里重写方法。
- public abstract class Builder
- {
- protected Bike mBike = new Bike();
-
- public abstract void buildBasket();
-
- public abstract void buildFrame();
-
- public abstract void buildSeat();
-
- public Bike createBike()
- {
- return mBike;
- }
- }
这里写了两个实现类,用于创建不同的自行车
- //山地自行车
- public class MountainBuilder : Builder
- {
- public override void buildBasket()
- {
- mBike.basket = "蓝色车篮";
- }
-
- public override void buildFrame()
- {
- mBike.frame = "铝合金车架";
- }
-
- public override void buildSeat()
- {
- mBike.seat = "橡胶车座";
- }
- }
-
- //公路自行车
- public class RoadBuilder : Builder
- {
- public override void buildBasket()
- {
- mBike.basket = "黑色车篮";
- }
-
- public override void buildFrame()
- {
- mBike.frame = "碳纤维车架";
- }
-
- public override void buildSeat()
- {
- mBike.seat = "海绵车座";
- }
- }
负责保证对象各部分完整创建或按某种顺序创建,这里根据传进来的builder实现类,依次调用他们的build方法。
- public class Director
- {
- private Builder _builder;
-
- public Director(Builder builder)
- {
- _builder = builder;
- }
-
- public Bike construct()
- {
- _builder.buildBasket();
- _builder.buildFrame();
- _builder.buildSeat();
- return _builder.createBike();
- }
- }
测试一下
创建一个Director实例,参数中带一个公路车实例,调用他的construct方法,就可以得到一辆公路车
- public static void Main(string[] args)
- {
- var director = new Director(new RoadBuilder());
- Bike bike = director.construct();
- Console.WriteLine($"车篮:{bike.basket}; 车架:{bike.frame}; 车座:{bike.seat}");
- }
如果想换成山地车,只需要将参数换成山地车的实例
var director = new Director(new MountainBuilder());
如果说现在有一个需求,所有使用此建造者模式创建的自行车都需要把自行车去掉,我们只需要在指挥者类Director中去掉对应的创建车篮方法
这时,所有调用指挥者的construct创建的自行车实例都没有车篮了