建造者模式
建造者模式的定义
建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
通俗点讲:
1.建造者是一种创建型模式,目的是创建所需要的对象
2.同工厂模式不一样的是,建造者的重心在如何组装对象而不是如何new对象
建造者模式的角色
1.产品 要创建的产品
2.抽象建造者 定义了组装产品的组装步骤
3.具体建造者 具体实现了组装产品的组装各个步骤
4.导演 指挥具体建造者去执行各个步骤
UML图例
代码实现
首先定义一个产品,这个产品有很多部件:parts: List, 添加部件的方法AddPart(string)和展示方法Show()
namespace DesignModel.BuilderPattern
{
public class Product
{
List<string> parts;
public Product()
{
parts = new List<string>();
}
public void AddPart(string part)
{
parts.Add(part);
}
public void Show()
{
for(int i=0; i<parts.Count; i++)
{
Debug.Log("part " + i + " : " + parts[i]);
}
}
}
}
然后定义我们的抽象建造者,这个抽象建造者定义了两个组装部件的方法,和获取实例的方法
namespace DesignModel.BuilderPattern
{
public interface IBuilder
{
void CreatePart1();
void CreatePart2();
Product GetResult();
}
}
定义一个具体的建造者去实现如何创建和组装产品
namespace DesignModel.BuilderPattern
{
public class ConcreteBuilder : IBuilder
{
private Product product = null;
public ConcreteBuilder()
{
product = new Product();
}
public void CreatePart1()
{
product.AddPart("Part0");
}
public void CreatePart2()
{
product.AddPart("Part1");
}
public Product GetResult()
{
return product;
}
}
}
定义我们的导演类,控制建造者组装具体的产品
namespace DesignModel.BuilderPattern
{
public class Director
{
public void Construct(IBuilder builder)
{
builder.CreatePart1();
builder.CreatePart2();
}
}
}
Client调用测试
using DesignModel.BuilderPattern;
public class BuilderClient : MonoBehaviour
{
void Start ()
{
//创建建造者
ConcreteBuilder builder = new ConcreteBuilder();
//创建导演
Director director = new Director();
//组装产品
director.Construct(builder);
//获取产品
Product product = builder.GetResult();
//展示产品
product.Show();
}
}
//结果
//part 0 : Part0
//part 1 : Part1
建造者模式的优点
1.将复杂产品的创建和组装分离了
在例子里,我们在建造者的构造函数中new了产品对象,这个时候的对象只具有一个空架子,而没有具体的部件,接着在导演Director中,去完成了产品对象部件的组装
2.抽象了建造者,使得导演用同样的建造过程可以创建出不同的产品,细节依赖于抽象
在我们的例子中,给导演不同的建造者,就能创建出部件不同的产品,而实际上,将产品抽象后,也可以用不同的建造者创建产品类型、部件都不同的产品
3.抽象了建造者,新增建造者和产品类型无需改动代码,符合开放封闭原则
建造者模式的缺点
1.产品需要具有共性,才能抽象出抽象的建造者
2.产品类别复杂的话,需要定义很多的建造者
适用范围
1.构建复杂,但具有共性的产品
2.要求方便修改构建顺序
3.要求相同的构建顺序可以产出不同的产品
拓展
提供一个接口去作为部件接口,而具体部件继承自这个接口
namespace DesignModel.BuilderPattern
{
public interface IPart {}
public class Product
{
List<IPart> parts;
public Product()
{
parts = new List<IPart>();
}
public void AddPart(IPart part)
{
parts.Add(part);
}
}
}