建造者模式定义:将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示
使用建造者模式用户只需要指定建造者的具体类型 就可以得到他们,而不需知道具体的生成过程和构建细节。
这个模式主要用于创建复杂的对象,这些对象内部的构造顺序通常是稳定的,但是对象内部的构造通常比较复杂
图示;
个人理解:
使用建造者模式一般是这样的一种情况,某个复杂对象他的创建过程是稳定,创建步骤是一定,有具体的流程。比如创建人这个对象,必须会创建头,手,脚灯,或者构建汽车,肯定会有轮胎,框架,颜色等等。这些复杂对象他们的创建步骤是必须的,而且每个步骤是不能省略的,但是这个步骤又是复杂,所以可以把这些必须的步骤封装起来而且这是方法必须实现不能被省略,
代码的解决办法父类使用抽象方法或者使用接口 来指定这些必须的方法步骤。因为父类使用抽象方法或者接口,那么子类继承的时候就必须实现他们。这样就实现了指定子类必须实现的方法,而且要再封装一个方法,把这些必须的方法全部继承到一个方法,让用户只调用者一个方法就完成了整个对象的构建
结构图中
Builder就是说的父类,他定义了要实现某个复杂对象必须的方法,而且是抽象方法,定义了抽象方法以后,子类就必须实现他,而不会被忽略。
ConcenterBuilder就是具体的构建类,他继承了父类,而且实现了其中的抽象方法
Product是一个产品
Director是一个封装类,他封装了Builder构建产品的所有方法,全部集合到一个方法中,提供一个简单的接口给外部使用者
代码:
/// <summary>
/// 产品 ,有多个部件组成
/// </summary>
public class product
{
List<string> part = new List<string>();
public void add(string part)
{
this.part.Add(part);
}
public void Show()
{
foreach (string p in this.part)
{
Console.WriteLine(p);
}
}
}
/// <summary>
/// 抽象建造者,声明了产品的两个部件,和返回产品对象
/// </summary>
public abstract class Builder
{
public abstract void BuildPartA();
public abstract void BuildPartB();
public abstract product GetProduct();
}
public class ConcreteBuilder1 : Builder
{
private product prod = new product();
public override void BuildPartA()
{
prod.add("Part A");
}
public override void BuildPartB()
{
prod.add("Part B");
}
public override product GetProduct()
{
return prod;
}
}
/// <summary>
/// 指挥类,暴露产品组成的统一简单接口
/// </summary>
public class Director
{
public void Construct(Builder builder)
{
builder.BuildPartA();
builder.BuildPartB();
}
static void main(string[] args)
{
Director dir = new Director();
ConcreteBuilder1 cbuilder1 = new ConcreteBuilder1();
dir.Construct(cbuilder1);//指挥官类构造这个产品,客户端无需知道怎么构造
product p = cbuilder1.GetProduct();//构造完成返回产品类
p.Show();
}
}
使用建造者模式用户只需要指定建造者的具体类型 就可以得到他们,而不需知道具体的生成过程和构建细节。
这个模式主要用于创建复杂的对象,这些对象内部的构造顺序通常是稳定的,但是对象内部的构造通常比较复杂
图示;
个人理解:
使用建造者模式一般是这样的一种情况,某个复杂对象他的创建过程是稳定,创建步骤是一定,有具体的流程。比如创建人这个对象,必须会创建头,手,脚灯,或者构建汽车,肯定会有轮胎,框架,颜色等等。这些复杂对象他们的创建步骤是必须的,而且每个步骤是不能省略的,但是这个步骤又是复杂,所以可以把这些必须的步骤封装起来而且这是方法必须实现不能被省略,
代码的解决办法父类使用抽象方法或者使用接口 来指定这些必须的方法步骤。因为父类使用抽象方法或者接口,那么子类继承的时候就必须实现他们。这样就实现了指定子类必须实现的方法,而且要再封装一个方法,把这些必须的方法全部继承到一个方法,让用户只调用者一个方法就完成了整个对象的构建
结构图中
Builder就是说的父类,他定义了要实现某个复杂对象必须的方法,而且是抽象方法,定义了抽象方法以后,子类就必须实现他,而不会被忽略。
ConcenterBuilder就是具体的构建类,他继承了父类,而且实现了其中的抽象方法
Product是一个产品
Director是一个封装类,他封装了Builder构建产品的所有方法,全部集合到一个方法中,提供一个简单的接口给外部使用者
代码:
/// <summary>
/// 产品 ,有多个部件组成
/// </summary>
public class product
{
List<string> part = new List<string>();
public void add(string part)
{
this.part.Add(part);
}
public void Show()
{
foreach (string p in this.part)
{
Console.WriteLine(p);
}
}
}
/// <summary>
/// 抽象建造者,声明了产品的两个部件,和返回产品对象
/// </summary>
public abstract class Builder
{
public abstract void BuildPartA();
public abstract void BuildPartB();
public abstract product GetProduct();
}
public class ConcreteBuilder1 : Builder
{
private product prod = new product();
public override void BuildPartA()
{
prod.add("Part A");
}
public override void BuildPartB()
{
prod.add("Part B");
}
public override product GetProduct()
{
return prod;
}
}
/// <summary>
/// 指挥类,暴露产品组成的统一简单接口
/// </summary>
public class Director
{
public void Construct(Builder builder)
{
builder.BuildPartA();
builder.BuildPartB();
}
static void main(string[] args)
{
Director dir = new Director();
ConcreteBuilder1 cbuilder1 = new ConcreteBuilder1();
dir.Construct(cbuilder1);//指挥官类构造这个产品,客户端无需知道怎么构造
product p = cbuilder1.GetProduct();//构造完成返回产品类
p.Show();
}
}
本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。