面向对象设计模式学习---Builder模式(创建型)

本文介绍了Builder设计模式的概念,它主要用于解决复杂对象部分需求的变化问题。通过将复杂对象抽象为多个子部件,并通过稳定算法进行组合,可以有效隔离部件对象变化带来的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      在软件系统中,有时候有些对象是由一些列与其相关的“部件对象”组成的复杂对象,该对象通过一种比较稳定的算法,将“部件对象”组合在一起,形成这个复杂对象。由于需求变化,这个复杂对象咯各个部分经常面临着剧烈的变化,从而影响了复杂对象的变化。Builder创建者模式,就是提供一种封装机制,将复杂对象与各部分对象将的关系隔离开,从而避免部件对象的剧烈变化而带动复杂对象的变化。

      Builder设计模式组要用于解决对象部分的需求变化,通常和Composite模式组合应用。

      Builder设计模式思想:将复杂对象抽象成由多个子部件,再通过相对稳定的算法将子部件组合成复杂对象。

      个人觉得,相对有Abstract Factory模式,创建者模式也有其相似点。首先抽象工厂模式,是针对一些列相互关联的对象,而创建者模式中谈及的部分对象也可以视为在复杂对象中相互关联的对象;其次,两者提供一些与对象类型无关的抽象方法,在具体类型中重载该方法,而在客户程序则调用与类型实例无关;当两者的需求都提出增加不同的新对象是,都不适于采用这两种模式。不同之处在于,Builder用不同对象组成一个复杂的对象,抽象工厂模式则是描述不同对象之间的相互关联的特性。(以上为个人理解,如有偏差,欢迎提出不同观点,谢谢!)

示例代码,假设构建一个House的复杂类。

ContractedBlock.gifExpandedBlockStart.gif抽象类
abstract class Door()
ExpandedBlockStart.gifContractedBlock.gif
{}
abstract class Wall()
ExpandedBlockStart.gifContractedBlock.gif
{}
abstract class Ceiling()
ExpandedBlockStart.gifContractedBlock.gif
{}
abstract class Floor()
ExpandedBlockStart.gifContractedBlock.gif
{}
abstract class Windows()
ExpandedBlockStart.gifContractedBlock.gif
{}
abstract class House()
ExpandedBlockStart.gifContractedBlock.gif
{}
abstract class Builder()
ExpandedBlockStart.gifContractedBlock.gif
{
  
public abstract void BuildDoor();
  
public abstract void BuildWall();
  
public abstract void BuildCeiling();
  
public abstract void BuildFloor();
  
public abstract void BuildWindows();

  
public abstract void GetHouse();
}

 

 

ContractedBlock.gifExpandedBlockStart.gif具体类型
public class WoodenDoor():Door
ExpandedBlockStart.gifContractedBlock.gif
{}
public class WoodenWall():Wall
ExpandedBlockStart.gifContractedBlock.gif
{}
public class WoodenCeiling():Celling
ExpandedBlockStart.gifContractedBlock.gif
{}
public class MarmorealFloor():Floor
ExpandedBlockStart.gifContractedBlock.gif
{}
public class WoodenWindows():Windows
ExpandedBlockStart.gifContractedBlock.gif
{}
public class TraditionalHouse():House
ExpandedBlockStart.gifContractedBlock.gif
{}
public class TraditionalBuilder():Builder
ExpandedBlockStart.gifContractedBlock.gif
{
ExpandedSubBlockStart.gifContractedSubBlock.gif  
public override void BuildDoor(){};
ExpandedSubBlockStart.gifContractedSubBlock.gif  
public override void BuildWall(){};
ExpandedSubBlockStart.gifContractedSubBlock.gif  
public override void BuildCeiling(){};
ExpandedSubBlockStart.gifContractedSubBlock.gif  
public override void BuildFloor(){};
ExpandedSubBlockStart.gifContractedSubBlock.gif  
public override void BuildWindows(){};

ExpandedSubBlockStart.gifContractedSubBlock.gif  
public override void GetHouse(){};
}

 

 

ContractedBlock.gifExpandedBlockStart.gif 客户端程序
public class HouseBuilder()
ExpandedBlockStart.gifContractedBlock.gif
{
  
public static House CreateHouse(Builder builder)
ExpandedSubBlockStart.gifContractedSubBlock.gif  
{
    builder.BuildDoor();
    builder.BuildWall();
    builder.BuildCeiling();
    builder.BuildFloor();
    builder.BuildWindows();
    
return builder.GetHouse();
  }

}

 

 

public class App
ExpandedBlockStart.gifContractedBlock.gif
{
  
public static void Main()
ExpandedSubBlockStart.gifContractedSubBlock.gif  
{
    House house
=HouseBuilder.CreateHouse(New TranditionalBuilder());
  }

}

 

转载于:https://www.cnblogs.com/FlyCloud/archive/2009/06/14/1502954.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值