建造者模式(生成器模式)

转载请注明出处!!!http://blog.csdn.net/zhonghuan1992

         全部配套代码均在github上:https://github.com/ZHONGHuanGit/DesignPattern

跟着ZHONGHuan学习设计模式

建造者模式(生成器模式)

简单介绍:

         建造者模式也叫做生成器模式,定义为:封装一个产品的构造过程,而且按此步骤构造。

         建造者模式(生成器模式)属于创建类模式,和工厂模式相比,你会认为有点类似,可是有差别之处。只是,建议在看下去之前,得明确三个工厂模式,假设你记得不太清楚了,能够看这里,简单工厂工厂方法抽象工厂

UML类图:

         看一下uml类图。这一部分,假设不清楚,能够先看以下的场景部分,再回过头来看。

从上面的类图中,能够看到有四个要素。

1          AbstractBuilder(抽象建造者):引入抽象建造者的目的,是为了将建造的详细过程交与它的子类来实现。这样更easy扩展。通常会有两部分抽象方法,一部分用来建造产品,一个是用来返回产品。如上面,buildPart1和buildPart2用来构造产品,retrieveResult返回产品。

2          ConcreteBuilder(详细建造者):实现抽象建造者的抽象方法,之所以这样,是为了便于不同情况下的扩充。

3          Director(导演者):负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。

4          Product(产品类):通常是一个较为复杂的对象,也就是说创建对象的过程比較复杂,通常会有比較多的代码量。在本类图中,产品类是一个详细的类,而非抽象类。实际编程中,产品类能够是由一个抽象类与它的不同实现组成,也能够是由多个抽象类与他们的实现组成。

场景导入:

         如果有这种要求,去游乐场玩,游乐场有非常多能够供娱乐的地方。比方有旋转木马,过山车,摩天轮,海盗船等等。当我们去玩得时候,至少不会胡来,自己还是有点计划的对吧。比方,小明想先去玩过山车(比較喜欢刺激的人),接着摩天轮,然后海盗船,最后旋转木马;另外一个小朋友也去玩,他想先玩摩天轮,接着。。。。,等等。如果每一个人的计划就是我们须要的产品,那么,如果你用工厂模式,怎样去设计把这个产品生成出来呢,当然,你一定能够想一些方法,即使不合适,但也可行。这里,比較合适的方法应该是生成器模式。

         又一次定义场景:临时定游乐场一共同拥有3个活动,各自是,摩天轮,海盗船,过山车。如今我们的产品是要出一份计划,是先玩哪个,所有玩,还是仅仅玩一个,这个计划就是产品。

让我们看一下实现的代码:

import java.util.ArrayList;
//如果产品是一份计划
class Plan{
	public ArrayList<String> list = new ArrayList<String>();
	void add(String str){
		list.add(str);
		System.out.println("将""+str+""增加计划");
	}
	void Out(){//打印出计划的内容
		System.out.println("计划内容例如以下:");
		for(String tmp:list){
	         System.out.println(tmp);
	    }
	}
}

interface AbstractBuilder{
	void addRollerCoaster();//将过山车增加计划
	void addFerrisWheel();//将摩天轮增加计划
	void addPirateShip();//将海盗船增加计划
	Plan retrievePlan();//返回计划
}

class ConcreteBuilder implements AbstractBuilder{
	Plan plan = new Plan();
	public void addRollerCoaster(){//将过山车增加计划
		plan.add("roller coaster");
	}
	public void addFerrisWheel(){//将摩天轮增加计划
		plan.add("ferris wheel");
	}
	public void addPirateShip(){//将海盗船增加计划
		plan.add("pirate ship");
	}
	public Plan retrievePlan()//返回计划
	{
		return plan;
	}
}

class Director{
	public void construct(){
		AbstractBuilder builder=new ConcreteBuilder();
		builder.addRollerCoaster();
		builder.addFerrisWheel();
		builder.addPirateShip();
		builder.addRollerCoaster();//玩第二次
		//构建完成后,我们就得到了我们的计划
		Plan plan=builder.retrievePlan();
		plan.Out();//打印出计划的内容
	}
}

public class Main{
	public static void main(String[] args){
		Director dir=new Director();
		dir.construct();
	}
}





输出:

        

         如今有一个小朋友,他指向玩一个摩天轮,那么依据他的要求,改变的仅仅是Director的部分。更改代码吐下:

class Director{
         public void construct(){
                   AbstractBuilder builder=new ConcreteBuilder();
                   builder.addFerrisWheel();
                   //构建完成后,我们就得到了我们的计划
                   Plan plan=builder.retrievePlan();
                   plan.Out();//打印出计划的内容
         }
}


         如果有一个小朋友,计划玩两次过山车(刺激男孩),那么,依然仅仅需更改Director的部分。

class Director{
         publicvoid construct(){
                   AbstractBuilder builder=new ConcreteBuilder();
                   builder.addRollerCoaster();
                   builder.addFerrisWheel();
                   builder.addPirateShip();
                   builder.addRollerCoaster();//玩第二次
                   //构建完成后,我们就得到了我们的计划
                   Plan plan=builder.retrievePlan();
                   plan.Out();//打印出计划的内容
         }
}


         建造者模式的长处,从上面我们能够体会出一点,product和builder部分一般不变,可是当有新的要求,Director部分能够通过变更满足这些要求。这样的将业务逻辑封装在导演类(Director)中的方式,对总体而言会有更好的稳定性。

简单论述工厂与建造者(生成器)模式的差别:

         工厂主要变更的地方是产品的变更,而builder 模式主要变更的地方则是director,就是组装的变更。工厂更倾向基本组件的生产,而builder是这些基本组件的组装。个人认为这两个是能够结合起来的。工厂更基本,builder更高层。

原文地址:https://www.cnblogs.com/lcchuguo/p/4004481.html