场景举例:
假设创建游戏中的一个房屋,该房屋的构建由几个部分构成,各部分富于变化。
房屋创建好后,房屋内设施变换(设施的风格功能等)
其中:
稳定:制作流程(高层抽象)
不稳定:设施具体功能、风格(底层实现)——封装
动机
在软件系统中,有时候会面临“一个复杂对象”的创建工作,其通常由各部分的子对象用一定的算法构成;由于需求变化,这个复杂的对象的各个部分经常面临着剧烈的变化,但是他们组合在一起的算法却相对稳定。
将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
结构
协作图
代码实例:
1、抽象Builder
public abstract class House
{
}
public abstract class Door
{
}
public abstract class Wall
{
}
public abstract class Window
{
}
public abstract class Floor
{
}
public abstract class Builder
{
public abstract void CreateDoor();
public abstract void CreateWall();
public abstract void CreateWindow();
public abstract void CreateFloor();
public abstract House GetHouse();
}
2、GameManager——此处为稳定,不变
(此处即为将他们组合在一起的算法)
public abstract class GameManager//稳定
{
public static House GetHouse(Builder builder)
{
builder.CreateFloor();
builder.CreateWall();
builder.CreateWall();
builder.CreateDoor();
builder.CreateWindow();
builder.CreateWindow();
builder.CreateWindow();
return builder.GetHouse();
}
}
3、具体类型部分
public class ModernHouse : House
{
}
public abstract class ModernDoor:Door
{
}
public abstract class ModernWall:Wall
{
}
public abstract class MordernWindow:Window
{
}
public abstract class MordernFloor:Floor
{
}
public class ModernBuilder:Builder
{
public override void CreateDoor()
{
}
public override void CreateWall()
{
}
public override void CreateWindow()
{
}
public override void CreateFloor()
{
}
public override House GetHouse()
{
return new ModernHouse();
}
}
4、使用
public static void Main(string[] args)
{
House house=GameManager.GetHouse(new ModernBuilder());
}
在传递参数可以使用动态方法,这样在需求变动时,使用这部分的也不必修改
要点
抽象工厂:一组对象稳定,(一系列相互耦合对象)
Builder:构建过程稳定,(一个大对象的子对象),对象部分需求变化
当设计系统全不变或全变,不使用设计模式。设计模式针对部分变化,但部分不变。
设计模式:关闭修改,开放扩展。(对新需求,新增而非修改)