设计模式之Builder 的学习笔记
Builder 生成器
最优秀的面向对象,就我们讲的设计模式,抽象出来,他解决的问题就是变化。如果没有变化我们
使用面向对象的理由或者讲他获得的好处要很低。正是因为他能够解决变化,能够封装这些
变化去应对这样一个需求变化是否能够对软件体系结构影响到什么程度。
系统的构建中的高层抽象部分(有一个稳定的主线)。
例如游戏场景设计中房屋的构建,
房屋都有地板、墙、窗户这些东西是构建这个房屋的元素或过程是相对不变的东西,但是对于房屋的地板、墙、
窗户、等这些元素的风格是富于变化的,是不稳定的。
房屋都有地板、墙、窗户这些东西是构建这个房屋的元素或过程是相对不变的东西,但是对于房屋的地板、墙、
窗户、等这些元素的风格是富于变化的,是不稳定的。
如果用直观的设计方法(结构化的设计方法),每一个房屋部分的变化,都将导致房屋构建的重新修正......
动机(Motivation)
在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个
部分的子对象用一定的算法构成(复杂的所在点);由于需求的变化,这个复杂对象的各个部分经常
面临着剧烈的变化,但是它们组合在一起的算法(像房屋的构建元素,建造房屋的方式)却是相对稳定。
部分的子对象用一定的算法构成(复杂的所在点);由于需求的变化,这个复杂对象的各个部分经常
面临着剧烈的变化,但是它们组合在一起的算法(像房屋的构建元素,建造房屋的方式)却是相对稳定。
如何应对这种变化?如何提供一种”封装机制“ 来隔离出复杂对象的各个部分的变化,从而
保持系统中的“稳定构建算法”不随着需求改变而改变?
保持系统中的“稳定构建算法”不随着需求改变而改变?
思考,如果是各个部分相对稳定,而算法却时常在变有该如何去运用设计模式?
意图(intent)
将一个复杂对象的构建与其表示分离,使得同样的构建过程(可以看着相同的算法)可以创建不同的表示。
将一个复杂对象的构建与其表示分离,使得同样的构建过程(可以看着相同的算法)可以创建不同的表示。
builder 应用
//一个抽象的House
abstract class House
{
}
//房屋的各个元素的抽象类
abstract class Door
{
abstract class Door
{
}
abstract class Window
{
{
}
abstract class Floor
{
abstract class Floor
{
}
abstract class HouseCeiling
{
abstract class HouseCeiling
{
}
//一个抽象的Builder
public abstract class Builder
{
public abstract void BuildDoor();//构造门
public abstract void BuildWail();//构造墙
public abstract void BuildWindows(); //构造窗户
public abstract void BuildFloor();//构造地板
public abstract void BuildHoseCeiling();//构造天花板
//一个抽象的Builder
public abstract class Builder
{
public abstract void BuildDoor();//构造门
public abstract void BuildWail();//构造墙
public abstract void BuildWindows(); //构造窗户
public abstract void BuildFloor();//构造地板
public abstract void BuildHoseCeiling();//构造天花板
public abstract House GetHouse();//这几个部分最终构成一个房屋
}
}
//相对来说比较稳定(房屋构建的算法)
public class GameManager
{
public static House CreateHose(Builder builder)
{
public class GameManager
{
public static House CreateHose(Builder builder)
{
//房屋构建两个门
builder.BuildDoor();
builder.BuildDoor();
//三个窗
builder.BuildWindow();
builder.BuildWindow();
builder.BuildWindow();
//一个地板
builder.BuildFloor();
//一个天花板
builder.BuildHoseCeiling();
builder.BuildDoor();
builder.BuildDoor();
//三个窗
builder.BuildWindow();
builder.BuildWindow();
builder.BuildWindow();
//一个地板
builder.BuildFloor();
//一个天花板
builder.BuildHoseCeiling();
return builder.GetHouse();//返回一个房屋。
}
}
接下来我们对房屋构建的具体实现。
比如说房屋时罗马风格的门、窗、地板等。
public class RoomanDoor:Door
{
}
public class RoomanWindow:Window
{
比如说房屋时罗马风格的门、窗、地板等。
public class RoomanDoor:Door
{
}
public class RoomanWindow:Window
{
}
public class RoomanFloor:Floor
{
public class RoomanFloor:Floor
{
}
public class RoomanHoseCeiling:HoseCeiling
{
{
}
//构建罗马风格房屋的构建
public class RoomanHouseBuilder:Builder
{
public override void BuildWall()
{
{
public override void BuildWall()
{
}
public override void BuildWindows()
{
{
}
......................
................................
}
......................
................................
}
//客户程序
class App
{
{
public static void Main()
{
//这里我们就可以采用动态链接的方式从配置文件中获取房屋风格
{
//这里我们就可以采用动态链接的方式从配置文件中获取房屋风格
string assemblyName=ConfigurationSettings["BuilderAssebmly"];
string builderNmae=ConfigurationSettings["BuilderClass"];
string builderNmae=ConfigurationSettings["BuilderClass"];
Assembly assembly=Assembly.Load(assemblyName);
Type t=assembly.GetType(builderName);
Builder builder=Activator.CreateInstence(t);
House house=GameManager.CreateHose( builder);
}
}
Builder 设计模式的几个要点
1、Builder 模式主要用于“分步骤构建一个复杂的对象”。在这其中“分步骤”是一个稳定
的算法,而复杂对象的各个部分则经常发生变化。
2、变化点在哪里,封装哪里------Builder模式主要在于应对“复杂对象各个部分”的频繁
需求变动,其缺点在于难以应对“分步骤构建算法”的需求变动
3、Abstract Factory 模式解决“系列对象”的需求变化,Building 模式解决“对象部分”
的需求变化。Building模式通常和Composite模式(组合模式)组合使用
Type t=assembly.GetType(builderName);
Builder builder=Activator.CreateInstence(t);
House house=GameManager.CreateHose( builder);
}
}
Builder 设计模式的几个要点
1、Builder 模式主要用于“分步骤构建一个复杂的对象”。在这其中“分步骤”是一个稳定
的算法,而复杂对象的各个部分则经常发生变化。
2、变化点在哪里,封装哪里------Builder模式主要在于应对“复杂对象各个部分”的频繁
需求变动,其缺点在于难以应对“分步骤构建算法”的需求变动
3、Abstract Factory 模式解决“系列对象”的需求变化,Building 模式解决“对象部分”
的需求变化。Building模式通常和Composite模式(组合模式)组合使用
1546

被折叠的 条评论
为什么被折叠?



