您的位置:首页 > 编程语言 > Java开发

设计模式之建造者模式

2017-05-07 14:28 239 查看
设计模式之建造者模式
    建造者模式(Builder Pattern)也叫生成器模式,定义:Separate the construction of complex object from its representation so that the same construction process can create different representations.(将一个复杂的对象的构建与它的表示分离,使得同样的构造过程可以创建不同的表示)

通用类图



4个角色

1.Product产品类:通常是实现了模板方法模式,也就是有模板方法和基本方法;

2.Builder抽象建造者类:规范产品的组件,一般是由子类实现;

3.ConcreteBuilder具体建造者类:实现抽象类定义的所有方法,并且返回一个组建好的对象;

4.Director导演类:负责安排已有模块的顺序,然后告诉Build开始建造。

产品类

public class Product {
public void doSomething(){

}
}抽象建造者类
public abstract class Builder {
//设置产品的不同部分,以获得不同的产品
public abstract void setPart();
//建造产品
public abstract Product buildProduct();
}具体建造者类
public class ConcreteProduct extends Builder{
private Product product=new Product();
//设置产品零件
public void setPart(){

}
//组建一个产品
public Product buildProduct(){
return product;
}
}
导演类
public class Director {
private Builder builder=new ConcreteProduct();
//构建不同的产品
public Product getAProduct(){
builder.setPart();
return builder.buildProduct();
}
}
建造者模式优点:

1.封装性,使用建造者模式,可以使得客户端不必知道产品内部组成细节;

2.建造者独立,容易扩展;

3.便于控制细节风险,由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。

建造者模式使用场景

1.相同的方法,不同的执行顺序,产生不同的事件结果;

2.多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同;

3.产品类非常复杂,或者产品类中的调用顺序不同产生了不同的功效;

4.对象创建过程中会使用到系统中的一些其他对象,这些对象在产品对象的创建过程中不易得到时;

注意事项

建造者模式关注的是零件类型和装配工艺(顺序),这是它与工厂方法模式最大的不同。

例子:不同汽车可以随意设置不同启停模式

汽车抽象类

public abstract class CarModel {
//各方法顺序
private ArrayList<String> sequence=new ArrayList<String>();

protected abstract void start();
protected abstract void stop();
protected abstract void alarm();
protected abstract void engineBoom();

final public void run()
{
for(int i=0;i<this.sequence.size();++i){
String actionName=this.sequence.get(i);
if(actionName.equalsIgnoreCase("start")){
this.start();
}else if(actionName.equalsIgnoreCase("stop")){
this.stop();
}else if(actionName.equalsIgnoreCase("alarm")){
this.alarm();
}else if(actionName.equalsIgnoreCase("engine boom"))
{
this.engineBoom();
}
}
}

final public void setSequence(ArrayList<String> sequence){
this.sequence=sequence;
}
}奔驰模型
public class BenzModel extends CarModel{
protected void start(){
System.out.println("启动");
}
protected void stop(){
System.out.println("停止");
}
protected void alarm(){
System.out.println("报警");
}
protected void engineBoom(){
System.out.println("发动机");
}
}宝马模型
public class BWMModel extends CarModel{
protected void start(){
System.out.println("启动");
}
protected void stop(){
System.out.println("停止");
}
protected void alarm(){
System.out.println("报警");
}
protected void engineBoom(){
System.out.println("发动机");
}
}抽象组装类
public abstract class CarBuilder {
//给定顺序
public abstract void setSequence(ArrayList<String>sequence);
//返回模型
public abstract CarModel getCarModel();
}奔驰组装类
public class BenzBuilder extends CarBuilder{
private BenzModel benz=new BenzModel();
public CarModel getCarModel(){
return this.benz;
}
public void setSequence(ArrayList<String> sequence){
this.benz.setSequence(sequence);
}
}宝马组装类
public class BWMBuilder extends CarBuilder{
private BWMModel bwm=new BWMModel();
public CarModel getCarModel(){
return this.bwm;
}
public void setSequence(ArrayList<String> sequence){
this.bwm.setSequence(sequence);
}
}导演类
public class Director {
private ArrayList<String> sequence=new ArrayList();
private BenzBuilder benzbuilder=new BenzBuilder();
private BWMBuilder bwmbuilder=new BWMBuilder();

public BenzModel getABenzModel(){
this.sequence.clear();
this.sequence.add("start");
this.sequence.add("stop");
this.benzbuilder.setSequence(sequence);
return (BenzModel)this.benzbuilder.getCarModel();
}

public BenzModel getBBenzModel(){
this.sequence.clear();
this.sequence.add("engine boom");
this.sequence.add("start");
this.sequence.add("stop");
this.benzbuilder.setSequence(sequence);
return (BenzModel)this.benzbuilder.getCarModel();
}

public BWMModel getCBWMModel(){
this.sequence.clear();
this.sequence.add("alarm");
this.sequence.add("start");
this.sequence.add("stop");
this.bwmbuilder.setSequence(sequence);
return (BWMModel)this.bwmbuilder.getCarModel();
}

public BWMModel getDBWMModel(){
this.sequence.clear();
this.sequence.add("start");
this.bwmbuilder.setSequence(sequence);
return (BWMModel)this.bwmbuilder.getCarModel();
}
}
场景类
public class Client {

public static void main(String[] args) {
// TODO Auto-generated method stub
Director director=new Director();
for(int i=0;i<10;++i){
director.getABenzModel().run();
}
for(int i=0;i<10;++i){
director.getBBenzModel().run();
}
for(int i=0;i<10;++i){
director.getCBWMModel().run();
}
for(int i=0;i<10;++i){
director.getDBWMModel().run();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息