设计模式学习—建造者模式
2014-01-12 21:44
253 查看
动机:构建与表示分离
结构:
3.角色:
抽象建造者
具体建造者
指挥者
产品
4.用例:javaMail、KFC套餐、游戏中的服装等
5.优缺点:
优点:
客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦
每一个具体建造者都相对独立,而与其他的具体建造者无关。户使用不同的具体建造者即可得到不同的产品对象
增加新的具体建造者无需修改原有类库的代码,系统扩展方便
缺点:
如果产品之间的差异性很大,不适合使用建造者模式
如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大
6.适用:
需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性
需要生成的产品对象的属性相互依赖,需要指定其生成顺序
对象的创建过程独立于创建该对象的类
隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同类型的产品
7.代码
/**
* 产品
*@author ilmlife(ilmlife @126.com)
* <pre>2013 -12- 16下午11:22:58</pre>
*/
public class Product
{
}
[align=left]/**[/align]
[align=left] * 抽象建造者[/align]
[align=left] *@author ilmlife(ilmlife @126.com)[/align]
[align=left] * <pre>2013 -12- 16下午11:30:50</pre>[/align]
[align=left] */[/align]
public abstract class Builder
{
[align=left] /**[/align]
[align=left] * 构造第一部分[/align]
[align=left] */[/align]
[align=left] public abstract void buildPart1();[/align]
[align=left] /**[/align]
[align=left] * 构造第二部分[/align]
[align=left] */[/align]
[align=left] public abstract void buildPart2();[/align]
[align=left] /**[/align]
[align=left] * 获取构造结果[/align]
[align=left] * @return[/align]
[align=left] */[/align]
public abstract Product
getResult();
[align=left]}[/align]
[align=left]
[/align]
[align=left]/**[/align]
[align=left] * 具体建造者[/align]
[align=left] *@author ilmlife(ilmlife @126.com)[/align]
[align=left] * <pre>2013 -12- 16下午11:33:24</pre>[/align]
[align=left] */[/align]
public class ConcreteBuilder extends Builder
{
[align=left] private Product product = new Product();[/align]
[align=left] @Override[/align]
public void buildPart1()
{
// TODO Auto-generated
method stub
[align=left] }[/align]
[align=left]
[/align]
[align=left] @Override[/align]
public void buildPart2()
{
// TODO Auto-generated
method stub
[align=left] }[/align]
[align=left]
[/align]
[align=left] @Override[/align]
public Product
getResult() {
[align=left] return product ;[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]/**[/align]
[align=left] * 指挥者[/align]
[align=left] *@author ilmlife(ilmlife @126.com)[/align]
[align=left] * <pre>2013 -12- 16下午11:34:35</pre>[/align]
[align=left] */[/align]
public class Director
{
[align=left] private Builder builder ;[/align]
[align=left] public void construct(){[/align]
[align=left] builder = new ConcreteBuilder();[/align]
[align=left] builder.buildPart1();[/align]
[align=left] builder.buildPart2();[/align]
[align=left] builder.getResult();[/align]
[align=left] }[/align]
[align=left]}[/align]
结构:
3.角色:
抽象建造者
具体建造者
指挥者
产品
4.用例:javaMail、KFC套餐、游戏中的服装等
5.优缺点:
优点:
客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦
每一个具体建造者都相对独立,而与其他的具体建造者无关。户使用不同的具体建造者即可得到不同的产品对象
增加新的具体建造者无需修改原有类库的代码,系统扩展方便
缺点:
如果产品之间的差异性很大,不适合使用建造者模式
如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大
6.适用:
需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性
需要生成的产品对象的属性相互依赖,需要指定其生成顺序
对象的创建过程独立于创建该对象的类
隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同类型的产品
7.代码
/**
* 产品
*@author ilmlife(ilmlife @126.com)
* <pre>2013 -12- 16下午11:22:58</pre>
*/
public class Product
{
}
[align=left]/**[/align]
[align=left] * 抽象建造者[/align]
[align=left] *@author ilmlife(ilmlife @126.com)[/align]
[align=left] * <pre>2013 -12- 16下午11:30:50</pre>[/align]
[align=left] */[/align]
public abstract class Builder
{
[align=left] /**[/align]
[align=left] * 构造第一部分[/align]
[align=left] */[/align]
[align=left] public abstract void buildPart1();[/align]
[align=left] /**[/align]
[align=left] * 构造第二部分[/align]
[align=left] */[/align]
[align=left] public abstract void buildPart2();[/align]
[align=left] /**[/align]
[align=left] * 获取构造结果[/align]
[align=left] * @return[/align]
[align=left] */[/align]
public abstract Product
getResult();
[align=left]}[/align]
[align=left]
[/align]
[align=left]/**[/align]
[align=left] * 具体建造者[/align]
[align=left] *@author ilmlife(ilmlife @126.com)[/align]
[align=left] * <pre>2013 -12- 16下午11:33:24</pre>[/align]
[align=left] */[/align]
public class ConcreteBuilder extends Builder
{
[align=left] private Product product = new Product();[/align]
[align=left] @Override[/align]
public void buildPart1()
{
// TODO Auto-generated
method stub
[align=left] }[/align]
[align=left]
[/align]
[align=left] @Override[/align]
public void buildPart2()
{
// TODO Auto-generated
method stub
[align=left] }[/align]
[align=left]
[/align]
[align=left] @Override[/align]
public Product
getResult() {
[align=left] return product ;[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]/**[/align]
[align=left] * 指挥者[/align]
[align=left] *@author ilmlife(ilmlife @126.com)[/align]
[align=left] * <pre>2013 -12- 16下午11:34:35</pre>[/align]
[align=left] */[/align]
public class Director
{
[align=left] private Builder builder ;[/align]
[align=left] public void construct(){[/align]
[align=left] builder = new ConcreteBuilder();[/align]
[align=left] builder.buildPart1();[/align]
[align=left] builder.buildPart2();[/align]
[align=left] builder.getResult();[/align]
[align=left] }[/align]
[align=left]}[/align]