Net设计模式实例之建造者模式(Builder Pattern)

简介:

一、建造者模式简介(Brief Introduction

建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示。

建造者模式的优点是:使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以如要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。

二、解决的问题(What To Solve

主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但是对象内部的构建通常面临着复杂的变化。

三、建造者模式分析(Analysis

1、建造者模式结构

 

Product:具体的产品。

Director:指挥者,构建一个使用Builder接口的对象。

Builder接口:是为创建一个Product对象的各个组件指定的抽象接口

ConcreteBuilder:具体的建造者,实现Builder接口,构造和装配各个部

2、源代码

1、具体产品Product

public class Product

{

    private IList<string> parts = new List<string>();

 

    public void Add(string part)

    {

        parts.Add(part);

    }

 

    public void Show()

    {

        Console.WriteLine("产品开始创建......");

        foreach (string part in parts)

        {

            Console.WriteLine("部件" + part);

        }

        Console.WriteLine("产品完成创建");

    }

}

 

2、抽象建造者Builder及其具体建造者ConcreteBuilder1ConcreteBuilder2

public abstract class Builder

{

    public abstract void BuildPartA();

    public abstract void BuildPartB();

    public abstract Product GetResult();

}

 

public class ConcreteBuilder1 : Builder

{

    Product product = new Product();

    public override void BuildPartA()

    {

        product.Add("A1");

    }

 

    public override void BuildPartB()

    {

        product.Add("B1");

    }

 

    public override Product GetResult()

    {

        return product;

    }

}

 

public class ConcreteBuilder2 : Builder

{

    Product product = new Product();

    public override void BuildPartA()

    {

        product.Add("A2");

    }

 

    public override void BuildPartB()

    {

        product.Add("B2");

    }

 

    public override Product GetResult()

    {

        return product;

    }

}

 

3、指挥者类Director

/// <summary>

/// 指挥建造过程

/// </summary>

public class Director

{

    public void Construct(Builder builder)

    {

        builder.BuildPartA();

        builder.BuildPartB();

    }

    StringBuilder

}

 

4、客户端代码

static void  Main (string[] args)

{

    Director director = new Director();

    Builder builder1 = new ConcreteBuilder1();

    Builder builder2 = new ConcreteBuilder2();

 

    director.Construct(builder1);

    Product product1 = builder1.GetResult();

    product1.Show();

 

    director.Construct(builder2);

    Product product2 = builder2.GetResult();

    product2.Show();

 

    Console.Read();

}

3、程序运行结果

四.案例分析(Example

1、场景

假设房子只有房顶和墙(Roof And Walls

Jane Joe两个客户需要从建造商Bob那里买房子。Jane需要1个房顶(Roof)4面墙(Walls)的房子,Joe需要1个房顶(Roof)7面墙(Walls)的房子。建造商需要通过建造者模式实现客户的个性要求。

此时建造商BobContractor)就是指挥者(Director),TownHomeSubContractorSingleFamilySubContractor就是建造者类(Builder Class),房子就是产品(House is Product.如下图所示

HouseHouse  is Pruduct

Contractor,指挥者

MakeHouse()方法,指挥房子建造过程。

ISubConstractor接口,建造者接口,

AddRoof().添加房顶方法

AddWalls(),添加墙的方法

GetHouse(),获得构建好的房子方法。

TownHomeSubContractor,具体的建造者,实现建造者接口方法。

建造一个房顶和四面墙,以满足Jane 的要求。

SingleFamilySubContractor,具体的建造者,实现建造者接口方法。

建造一个房顶和七面墙,以满足Joe的要求。

 

2、代码

1、产品House

public class House

{

    public string Roof { getset; }

    public string Walls { getset; }

}

 

 

2、指挥者类Contractor

public class Contractor

{

    public void MakeHouse(ISubContractor contractor)

    {

        contractor.AddRoof();

        contractor.AddWalls();

    }

}

 

3、抽象建造者ISubContractor及其具体建造者TownHomeSubContractorSingleFamilySubContractor

//Sub Contractor interface (IBuilder)  

    public interface ISubContractor

    {

        void AddRoof();

        void AddWalls();

        House GetHouse();

    }

 

    //Concrete Builder Classes  

    public class TownHomeSubContractor : ISubContractor

    {

        private House _house = new House();

 

        public void AddRoof()

        {

            _house.Roof = "Adding a small roof";

        }

 

        public void AddWalls()

        {

            _house.Walls = "Adding 4 Walls";

        }

 

        public House GetHouse()

        {

            return _house;

        }

    }

 

    public class SingleFamilySubContractor : ISubContractor

    {

        private House _house = new House();

 

        public void AddRoof()

        {

            _house.Roof = "Adding a large roof";

        }

 

        public void AddWalls()

        {

            _house.Walls = "Adding 7 Walls";

        }

 

        public House GetHouse()

        {

            return _house;

        }

   }

 

4、客户端代码

static void  Main (string[] args)

{

    //Jane wants a Town Home  

    Console.WriteLine("Building a Town Home for Jane..");

    Contractor contractor = new Contractor();

    ISubContractor subContractorTownHome = newTownHomeSubContractor();

    contractor.MakeHouse(subContractorTownHome);

    House townHome = subContractorTownHome.GetHouse();

    Console.WriteLine(townHome.Roof + "..");

    Console.WriteLine(townHome.Walls + "..");

 

    //Joe wants a Single Family Home  

    Console.WriteLine("\nBuilding a Town Home for Joe..");

    ISubContractor subContractorSingleFamily = newSingleFamilySubContractor();

    contractor.MakeHouse(subContractorSingleFamily);

    House singleFamilyHouse = subContractorSingleFamily.GetHouse();

    Console.WriteLine(singleFamilyHouse.Roof + "..");

    Console.WriteLine(singleFamilyHouse.Walls + "..");

}

 

3、程序运行结果

五、总结(Summary

建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示。建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时适用的模式。

 


本文转自灵动生活博客园博客,原文链接: http://www.cnblogs.com/ywqu/archive/2010/01/11/1643753.html ,如需转载请自行联系原作者

    

相关文章
|
2月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性本文旨在探讨PHP中常见的设计模式及其应用,帮助开发者编写出更加灵活、可维护和易于扩展的代码。通过深入浅出的解释和实例演示,我们将了解如何使用设计模式解决实际开发中的问题,并提升代码质量。
在软件开发过程中,设计模式是一套经过验证的解决方案模板,用于处理常见的软件设计问题。PHP作为流行的服务器端脚本语言,也有其特定的设计模式应用。本文将重点介绍几种PHP中常用的设计模式,包括单例模式、工厂模式和策略模式,并通过实际代码示例展示它们的具体用法。同时,我们还将讨论如何在实际项目中合理选择和应用这些设计模式,以提升代码的可维护性和扩展性。
60 4
|
1月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:如何提高代码的可维护性与扩展性在软件开发领域,PHP 是一种广泛使用的服务器端脚本语言。随着项目规模的扩大和复杂性的增加,保持代码的可维护性和可扩展性变得越来越重要。本文将探讨 PHP 中的设计模式,并通过实例展示如何应用这些模式来提高代码质量。
设计模式是经过验证的解决软件设计问题的方法。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理地使用设计模式可以显著提高代码的可维护性、复用性和扩展性。本文将介绍几种常见的设计模式,包括单例模式、工厂模式和观察者模式,并通过具体的例子展示如何在PHP项目中应用这些模式。
|
2月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
2月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
44 2
|
2月前
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
5月前
|
设计模式 安全 Java
Java中的单例模式是一种设计模式,它保证一个类只有一个实例,并提供一个全局访问点
Java单例模式确保类仅有一个实例,并提供全局访问点。常见实现包括: - 饿汉式:静态初始化,线程安全。 - 懒汉式:延迟初始化,需同步保证线程安全。 - 双重检查锁定:优化懒汉式,减少同步开销。 - 静态内部类:延迟加载,线程安全。 - 枚举:简洁线程安全,不适用于复杂构造。 - 容器实现:如Spring框架,用于依赖注入。选择依据需求,如延迟加载、线程安全和扩展性。
69 10
|
4月前
|
设计模式 缓存 JavaScript
js设计模式实例
【7月更文挑战第2天】JavaScript设计模式包含工厂、单例、建造者、抽象工厂和代理模式等,它们是最佳实践和可重用模板,解决创建、职责分配和通信等问题。例如,工厂模式封装对象创建,单例确保全局唯一实例,建造者模式用于复杂对象构建,抽象工厂创建相关对象集合,而代理模式则控制对象访问。这些模式提升代码质量、可读性和灵活性,是高效开发的关键。
37 0
|
5月前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)
|
6月前
|
设计模式 安全 Java
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
该文介绍了一种C++的编程技巧——奇异递归模板模式(CRTP),旨在让派生组件能继承基本组件的特定功能。通过示例展示了如何创建一个`Fighter`接口和`MmaFighter`类,其中`MmaFighter`及其子类如`MmaBantamweightFighter`和`MmaHeavyweightFighter`强制类型安全,确保相同重量级的拳手之间才能进行比赛。这种设计避免了不同重量级拳手间的错误匹配,编译时会报错。CRTP适用于处理类型冲突、参数化类方法和限制方法只对相同类型实例生效的情况。
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    42
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    46
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    54
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    37
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    61
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    57
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    41
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    49
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    106
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    76