建筑者模式

definition

定义

Separate the construction of a complex object from its representation so that the same construction process can create different representations.

UML class diagram

 

participants

参与者

    The classes and/or objects participating in this pattern are:

  • Builder  (VehicleBuilder)
    • specifies an abstract interface for creating parts of a Product object
  • ConcreteBuilder  (MotorCycleBuilder, CarBuilder, ScooterBuilder)
    • constructs and assembles parts of the product by implementing the Builder interface
    • defines and keeps track of the representation it creates
    • provides an interface for retrieving the product
  • Director  (Shop)
    • constructs an object using the Builder interface
  • Product  (Vehicle)
    • represents the complex object under construction. ConcreteBuilder builds the product's internal representation and defines the process by which it's assembled
    • includes classes that define the constituent parts, including interfaces for assembling the parts into the final result

sample code in C#

简单代码(C#)

This structural code demonstrates the Builder pattern in which complex objects are created in a step-by-step fashion. The construction process can create different object representations and provides a high level of control over the assembly of the objects.

// Builder pattern -- Structural example
using System;
using System.Collections;

namespace DoFactory.GangOfFour.Builder.Structural
{
   // MainApp test application

   public class MainApp
  {
     public static void Main()
    {
       // Create director and builders
      Director director = new Director();

      Builder b1 = new ConcreteBuilder1();
      Builder b2 = new ConcreteBuilder2();

       // Construct two products
      director.Construct(b1);
      Product p1 = b1.GetResult();
      p1.Show();

      director.Construct(b2);
      Product p2 = b2.GetResult();
      p2.Show();

       // Wait for user
      Console.Read();
    }
  }

   // "Director"

   class Director
  {
     // Builder uses a complex series of steps
     public void Construct(Builder builder)
    {
      builder.BuildPartA();
      builder.BuildPartB();
    }
  }

   // "Builder"

   abstract class Builder
  {
     public abstract void BuildPartA();
     public abstract void BuildPartB();
     public abstract Product GetResult();
  }

   // "ConcreteBuilder1"

   class ConcreteBuilder1 : Builder
  {
     private Product product = new Product();

     public override void BuildPartA()
    {
      product.Add("PartA");
    }

     public override void BuildPartB()
    {
      product.Add("PartB");
    }

     public override Product GetResult()
    {
       return product;
    }
  }

   // "ConcreteBuilder2"

   class ConcreteBuilder2 : Builder
  {
     private Product product = new Product();

     public override void BuildPartA()
    {
      product.Add("PartX");
    }

     public override void BuildPartB()
    {
      product.Add("PartY");
    }

     public override Product GetResult()
    {
       return product;
    }
  }

   // "Product"

   class Product
  {
    ArrayList parts = new ArrayList();

     public void Add( string part)
    {
      parts.Add(part);
    }

     public void Show()
    {
      Console.WriteLine("/nProduct Parts -------");
       foreach ( string part in parts)
        Console.WriteLine(part);
    }
  }
}

实际用例

This real-world code demonstates the Builder pattern in which different vehicles are assembled in a step-by-step fashion. The Shop uses VehicleBuilders to construct a variety of Vehicles in a series of sequential steps.

// Builder pattern -- Real World example

using System;
using System.Collections;

namespace DoFactory.GangOfFour.Builder.RealWorld
{
   // MainApp test application

   public class MainApp
  {
     public static void Main()
    {
       // Create shop with vehicle builders
      Shop shop = new Shop();
      VehicleBuilder b1 = new ScooterBuilder();
      VehicleBuilder b2 = new CarBuilder();
      VehicleBuilder b3 = new MotorCycleBuilder();

       // Construct and display vehicles
      shop.Construct(b1);
      b1.Vehicle.Show();

      shop.Construct(b2);
      b2.Vehicle.Show();

      shop.Construct(b3);
      b3.Vehicle.Show();

       // Wait for user
      Console.Read();
    }
  }

   // "Director"

   class Shop
  {
     // Builder uses a complex series of steps
     public void Construct(VehicleBuilder vehicleBuilder)
    {
      vehicleBuilder.BuildFrame();
      vehicleBuilder.BuildEngine();
      vehicleBuilder.BuildWheels();
      vehicleBuilder.BuildDoors();
    }
  }

   // "Builder"

   abstract class VehicleBuilder
  {
     protected Vehicle vehicle;

     // Property
     public Vehicle Vehicle
    {
       get{ return vehicle; }
    }

     public abstract void BuildFrame();
     public abstract void BuildEngine();
     public abstract void BuildWheels();
     public abstract void BuildDoors();
  }

   // "ConcreteBuilder1"

   class MotorCycleBuilder : VehicleBuilder
  {
     public override void BuildFrame()
    {
      vehicle = new Vehicle("MotorCycle");
      vehicle["frame"] = "MotorCycle Frame";
    }

     public override void BuildEngine()
    {
      vehicle["engine"] = "500 cc";
    }

     public override void BuildWheels()
    {
      vehicle["wheels"] = "2";
    }

     public override void BuildDoors()
    {
      vehicle["doors"] = "0";
    }
  }

   // "ConcreteBuilder2"

   class CarBuilder : VehicleBuilder
  {
     public override void BuildFrame()
    {
      vehicle = new Vehicle("Car");
      vehicle["frame"] = "Car Frame";
    }

     public override void BuildEngine()
    {
      vehicle["engine"] = "2500 cc";
    }

     public override void BuildWheels()
    {
      vehicle["wheels"] = "4";
    }

     public override void BuildDoors()
    {
      vehicle["doors"] = "4";
    }
  }

   // "ConcreteBuilder3"

   class ScooterBuilder : VehicleBuilder
  {
     public override void BuildFrame()
    {
      vehicle = new Vehicle("Scooter");
      vehicle["frame"] = "Scooter Frame";
    }

     public override void BuildEngine()
    {
      vehicle["engine"] = "50 cc";
    }

     public override void BuildWheels()
    {
      vehicle["wheels"] = "2";
    }

     public override void BuildDoors()
    {
      vehicle["doors"] = "0";
    }
  }

   // "Product"

   class Vehicle
  {
     private string type;
     private Hashtable parts = new Hashtable();

     // Constructor
     public Vehicle( string type)
    {
       this.type = type;
    }

     // Indexer (i.e. smart array)
     public object this[ string key]
    {
       get{ return parts[key]; }
       set{ parts[key] = value; }
    }

     public void Show()
    {
      Console.WriteLine("/n---------------------------");
      Console.WriteLine("Vehicle Type: {0}", type);
      Console.WriteLine(" Frame : {0}", parts["frame"]);
      Console.WriteLine(" Engine : {0}", parts["engine"]);
      Console.WriteLine(" #Wheels: {0}", parts["wheels"]);
      Console.WriteLine(" #Doors : {0}", parts["doors"]);
    }
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
建筑旅游是一种以古建筑为中心,以旅游为目的的活动模式。它不仅可以丰富旅游者的视野,还能让他们了解历史文化,更深入地感受古建筑的魅力。古建筑旅游既可以是短途游,也可以是长途游。短途游通常只包括一两天的游览时间,而长途游则可以持续几天甚至几周。旅游者可以游览各地的古建筑,也可以深度探访一个特定的古建筑。古建筑旅游可以从多方面来提高旅游者的体验。首先,可以让游客更深入地了解历史文化,更好地理解古建筑的精髓。其次,可以提供更多的摄影机会,让游客拍摄到更多漂亮的古建筑照片。此外,还可以为游客提供更多的互动项目,以让他们更好地体验古建筑的魅力,比如,可以让他们参与到古建筑修缮工作中来,或参与到当地的文化活动中来,让游客参与当地的文化传承,增进友谊。由于古建筑旅游的特殊性,它的安全性也非常重要。古建筑旅游机构应该对游客进行安全检查,提供安全指南,提供安全设施,并且严格控制游客的行为,以确保游客的安全。古建筑旅游是一种共赢的旅游模式,它可以让游客更好地参与到古建筑文化中来,并且可以给当地人带来经济效益。古建筑旅游不仅是一种旅游模式,也是一种文化传承的方式,让游客更好地了解古建筑的魅力,并让古建筑的历史文化得以传承下去。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值