极速理解设计模式系列:1.建造者模式(Builder Pattern)

简介:

4个角色:指挥者(Director),建造者(Builder),具体建造者(ConcreteBuilder),产品(Product)
         产品:需要创建的对象产品
         具体建造者:创建产品的实例并且实现建造者多个方法对产品进行装配
         建造者:本质为抽象类,里面的抽象方法供具体建造者重写,声明产品的引用
         指挥者:调用建造者抽象类以及其方法


       实现思路:客户端创建一个指挥者,并且实例化需要的产品的具体建造者,然后指挥者调用具体建造者的实例即将产品生产出来。

 类图:

        


        应用场景:在Silverlight中我们需要生产一列多行的输入框+TextBlock的组合,但是这些输入框的类型不同,有一些只能输入256个字符,有的只能输入20个字符,还有的是多行的,有的是单行的输入框。这些输入框的种类是固定的,但是可能用户自定义输入框的时候我们生成的顺序和各自的生成数量不知道。


        分析:在这里产品是固定的,有A,B,C,D,E,F六种输入框+TextBlock,用户可能生成的情况是A,A,C,C,B,B,C、也可能是B,C,D,B,C,F。这里我们使用建造者模式,这几种输入框基本上都差不多,都是TextBlock+TextBox的模式。但是可输入数量和是否多行是不定的,那么我们实现AConcreteBuilder,BConcreteBuilder,CConcreteBuilder,DConcreteBuilder,EConcreteBuilder,FConcreteBuilder等多个具体建造者,然后对于建造者中只需要两个方法分别实例化产品,并且对产品的属性(可输入字符数、是否可多行)进行设置,然后再用户需要调用什么产品的时候,使用指挥者调用想要的ConcreteBuilder具体建造者即可。

        下面我们以一个电脑产品生产的实例来具体看看Builder Pattern是如何使用的:

        一、产品角色

复制代码
// 产品
class  Computer
{
private   string  m_CompName;
private   string  m_MemorySize;
private   string  m_DiskSize;

///   <summary>
///  电脑名称
///   </summary>
public   string  CompName
{
get  {  return  m_CompName; }
set  { m_CompName  =  value; }
}

///   <summary>
///  内存大小
///   </summary>
public   string  MemorySize
{
get  {  return  m_MemorySize; }
set  { m_MemorySize  =  value; }
}

///   <summary>
///  硬盘大小
///   </summary>
public   string  DiskSize
{
get  {  return  m_DiskSize; }
set  { m_DiskSize  =  value; }
}
///   <summary>
///  显示产品的信息
///   </summary>
public   void  ShowComputerInfo()
{
Console.WriteLine(
" ------------------------ " );
Console.WriteLine(
" 电脑名称: "   +  CompName);
Console.WriteLine(
" 内存大小: "   +  MemorySize);
Console.WriteLine(
" 硬盘大小: "   +  DiskSize);
}
}
复制代码

        二、建造者角色

复制代码
// 建造者 定义建造产品的抽象方法和产品的引用
abstract   class  ComputerBuilder
{
private  Computer computerInstance;

///   <summary>
///  返回建立的电脑产品实例
///   </summary>
public  Computer ComputerInstance
{
get  {  return  computerInstance; }
set  { computerInstance = value; }
}

///   <summary>
///  创建电脑名称
///   </summary>
abstract   public   void  CreateCompName();

///   <summary>
///  创建电脑内存
///   </summary>
abstract   public   void  CreateCompMemory();

///   <summary>
///  创建电脑硬盘
///   </summary>
abstract   public   void  CreateCompDisk();

}
复制代码

        三、具体建造者角色

复制代码
// 具体建造者创建苹果电脑
class  AppleConcreteBuilder : ComputerBuilder
{

public   override   void  CreateCompName()
{
ComputerInstance 
=   new  Computer();
ComputerInstance.CompName 
=   " 苹果电脑 " ;
}

public   override   void  CreateCompMemory()
{
ComputerInstance.MemorySize 
=   " 4G " ;
}

public   override   void  CreateCompDisk()
{
ComputerInstance.DiskSize 
=   " 500G " ;
}
}

// 具体建造者创建戴尔电脑
class  DellConcreteBuilder : ComputerBuilder
{

public   override   void  CreateCompName()
{
ComputerInstance 
=   new  Computer();
ComputerInstance.CompName 
=   " 戴尔电脑 " ;
}

public   override   void  CreateCompMemory()
{
ComputerInstance.MemorySize 
=   " 2GB " ;
}

public   override   void  CreateCompDisk()
{
ComputerInstance.DiskSize 
=   " 320GB " ;
}
}

// 具体建造者创建惠普电脑
class  HpConcreteBuilder : ComputerBuilder
{

public   override   void  CreateCompName()
{
ComputerInstance 
=   new  Computer();
ComputerInstance.CompName 
=   " 惠普电脑 " ;
}

public   override   void  CreateCompMemory()
{
ComputerInstance.MemorySize 
=   " 1GB " ;
}

public   override   void  CreateCompDisk()
{
ComputerInstance.DiskSize 
=   " 160GB " ;
}
}

// 具体建造者创建IBM电脑
class  IBMConcreteBuilder : ComputerBuilder
{

public   override   void  CreateCompName()
{
ComputerInstance 
=   new  Computer();
ComputerInstance.CompName 
=   " IBM电脑 " ;
}

public   override   void  CreateCompMemory()
{
ComputerInstance.MemorySize 
=   " 2G " ;
}

public   override   void  CreateCompDisk()
{
ComputerInstance.DiskSize 
=   " 1000G " ;
}
}
复制代码

        四、指挥者角色

复制代码
// 指挥者
class  CreateDirector
{
///   <summary>
///  调用建造者抽象方法以生产产品
///   </summary>
///   <param name="compBuilder"></param>
public   void  CreateComputer(ComputerBuilder compBuilder)
{
compBuilder.CreateCompName();
compBuilder.CreateCompMemory();
compBuilder.CreateCompDisk();
}
}
复制代码
相关文章
|
弹性计算 缓存 负载均衡
ECS性能优化建议
ECS性能优化建议
694 3
|
分布式计算 测试技术 API
为集成LLM到测试平台提供更便捷的方式:为讯飞的LLM星火创建接入LangChain类(全部源代码)
为集成LLM到测试平台提供更便捷的方式:为讯飞的LLM星火创建接入LangChain类(全部源代码)
886 0
|
弹性计算 Cloud Native Serverless
云原生 云原生 serverless
云原生服务是包含硬件、架构,硬件,因云而生,所以称为云原生技术。 Serverless=Faas+Baas 同时具有按量付费和弹性伸缩的特点,该架构包括了函数维度和应用维度的两种形态 关键字解析
189 3
|
开发框架 数据安全/隐私保护 开发者
HBuilder开发者必备!Windows上传IPA文件的软件分享
HBuilder开发者必备!Windows上传IPA文件的软件分享
159 1
|
消息中间件 监控 Java
Java一分钟之-Spring Integration:企业级集成
【6月更文挑战第11天】Spring Integration是Spring框架的一部分,用于简化企业应用的集成,基于EIP设计,采用消息传递连接不同服务。核心概念包括通道(Channel)、端点(Endpoint)和适配器(Adapter)。常见问题涉及过度设计、消息丢失与重复处理、性能瓶颈。解决策略包括遵循YAGNI原则、使用幂等性和事务管理、优化线程配置。通过添加依赖并创建简单消息处理链,可以开始使用Spring Integration。注意实践中要关注消息可靠性、系统性能,逐步探索高级特性以提升集成解决方案的质量和可维护性。
402 3
Java一分钟之-Spring Integration:企业级集成
|
Linux Python
【Linux】查看目录和更改目录
【Linux】查看目录和更改目录
314 3
|
关系型数据库 程序员 BI
程序员中医诊所管理软件开发模块分析
将系统划分为患者管理模块、医生管理模块、药材药方管理模块、财务管理模块、报表统计模块和系统设置模块。
185 2
|
存储 API C语言
当创建一个 Python 对象时,背后都经历了哪些过程?
当创建一个 Python 对象时,背后都经历了哪些过程?
163 3
|
安全 编译器 C++
智能指针shared_ptr、unique_ptr、weak_ptr
智能指针shared_ptr、unique_ptr、weak_ptr
482 0
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的医院病历管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的医院病历管理系统附带文章源码部署视频讲解等
122 0