http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 4216|回复: 5

[学习心得] C#建造者模式实现

[复制链接]
发表于 2019-1-2 20:13:24 | 显示全部楼层 |阅读模式
五 、  建造者模式的实现 :

      下面的程序代码演示了 Shop 对象使用 VehicleBuilders 来建造不同的交通工具。该例子使用了 Builder 模式
顺序建造交通工具的不同部分。

[C#] 纯文本查看 复制代码
// Builder pattern -- Real World example
using System;
using System.Collections;
// "Director"
class Shop
{
// Methods
public void Construct( VehicleBuilder vehicleBuilder )
{
vehicleBuilder.BuildFrame();
vehicleBuilder.BuildEngine();
vehicleBuilder.BuildWheels();
vehicleBuilder.BuildDoors();
}
}
// "Builder"
abstract class VehicleBuilder
{
// Fields
protected Vehicle vehicle;
// Properties
public Vehicle Vehicle
{
get{ return vehicle; }
}
// Methods
abstract public void BuildFrame();
abstract public void BuildEngine();
abstract public void BuildWheels();
abstract public void BuildDoors();
}
// "ConcreteBuilder1"
class MotorCycleBuilder : VehicleBuilder
{
// Methods
override public void BuildFrame()
{
vehicle = new Vehicle( "MotorCycle" );
vehicle[ "frame" ] = "MotorCycle Frame";
}
override public void BuildEngine()
{
vehicle[ "engine" ] = "500 cc";
}
override public void BuildWheels()
{
vehicle[ "wheels" ] = "2";
}
override public void BuildDoors()
{
vehicle[ "doors" ] = "0";
}
}
// "ConcreteBuilder2"
class CarBuilder : VehicleBuilder
{
// Methods
override public void BuildFrame()
{
vehicle = new Vehicle( "Car" );
vehicle[ "frame" ] = "Car Frame";
}
override public void BuildEngine()
{
vehicle[ "engine" ] = "2500 cc";
}
override public void BuildWheels()
{
vehicle[ "wheels" ] = "4";
}
override public void BuildDoors()
{
vehicle[ "doors" ] = "4";
}
}
// "ConcreteBuilder3"
class ScooterBuilder : VehicleBuilder
{
// Methods
override public void BuildFrame()
{
vehicle = new Vehicle( "Scooter" );
vehicle[ "frame" ] = "Scooter Frame";
}
override public void BuildEngine()
{
vehicle[ "engine" ] = "none";
}
override public void BuildWheels()
{
vehicle[ "wheels" ] = "2";
}
override public void BuildDoors()
{
vehicle[ "doors" ] = "0";
}
}
// "Product"
class Vehicle
{
// Fields
private string type;
private Hashtable parts = new Hashtable();
// Constructors
public Vehicle( string type )
{
this.type = type;
}
// Indexers
public object this[ string key ]
{
get{ return parts[ key ]; }
set{ parts[ key ] = value; }
}
// Methods
public void Show()
{
Console.WriteLine( " ---------------------------");
Console.WriteLine( "Vehicle Type: "+ type );
Console.WriteLine( " Frame : " + parts[ "frame" ] );
Console.WriteLine( " Engine : "+ parts[ "engine"] );
Console.WriteLine( " #Wheels: "+ parts[ "wheels"] );
Console.WriteLine( " #Doors : "+ parts[ "doors" ] );
}
}
/// <summary>
/// BuilderApp test
/// </summary>
public class BuilderApp
{
public static void Main( string[] args )
{
// Create shop and 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();
}
}


六 、  建造者模式的演化
建造者模式在使用的过程中可以演化出多种形式。

省略抽象建造者角色

如果系统中只需要一个具体建造者的话,可以省略掉抽象建造者。这时代码可能如下:

[C#] 纯文本查看 复制代码
// "Director"
class Director
{
private ConcreteBuilder builder;
// Methods
public void Construct()
{
builder.BuildPartA();
builder.BuildPartB();
}
}


略指导者角色

在具体建造者只有一个的情况下,如果抽象建造者角色已经被省略掉,那么还可以省略掉指导者角色。让 Builder
角色自己扮演指导者与建造者双重角色。这时代码可能如下:

[C#] 纯文本查看 复制代码
public class Builder
{
private Product product = new Product();
public void BuildPartA()
{
//Some code here
}
public void BuildPartB()
{
//Some code here
}
public Product GetResult()
{
return product;
}
public void Construct()
{
BuildPartA();
BuildPartB();
}
}


同时,客户端也需要进行相应的调整,如下:

[C#] 纯文本查看 复制代码
public class Client
{
private static Builder builder;
public static void Main()
{
builder = new Builder();
builder.Construct();
Product product = builder.GetResult();
}
}


C#中的 StringBuilder 就是这样一个例子。

七 、  在什么情况下使用建造者模式

以下情况应当使用建造者模式:
1、 需要生成的产品对象有复杂的内部结构。
2、 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
3、 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。

使用建造者模式主要有以下效果:

1、 建造模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成
的细节。
2、 每一个 Builder 都相对独立,而与其它的 Builder 无关。
3、 模式所建造的最终产品更易于控制。



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2019-1-3 08:24:53 | 显示全部楼层
我只是路过打酱油的。
发表于 2019-1-3 08:43:31 | 显示全部楼层
我只是路过打酱油的。
发表于 2019-1-3 08:44:42 | 显示全部楼层
强烈支持楼主ing……
发表于 2019-1-3 09:03:53 | 显示全部楼层
强烈支持楼主ing……
发表于 2019-1-3 15:58:25 | 显示全部楼层
我只是路过打酱油的。
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-23 00:15

© 2014-2021

快速回复 返回顶部 返回列表