您的位置:首页 > 其它

[设计模式] - No.3 建造者模式

2017-05-20 10:55 274 查看
今天学习了设计模式中的建造者模式(Builder Pattern),这个模式也是属于四种设计模式中的创建型模式,四种模式如下所示:





建造者模式结构图如下:



在建造者模式中,我们需要用到四种角色:

1. Director:指挥者,根据用户需求来构建小人对象

2. Builder:建造者接口,用于创造Product各个部件指定的接口。内含建造Product的方法

3. ConcretedBuilder:实现Builder接口,用于构造和装配各个部件

4. Product:具体产品

总结构建者模式:将一个复杂对象的构建和他的表示分离,使得同样的构建过程可以创建不同的表示。

下面我们就以建造汽车的例子来示范一下建造者模式:



Car代码:

/**
* Created by YanMing on 2017/5/20.
*/
public class Car {
public String wheel;
public String body;
public String brand;
public void setCarWheel(String wheel){
this.wheel = wheel;
}
public void setCarBody(String body){
this.body = body;
}

public void setCarBrand(String brand){
this.brand = brand;
}
public void showMyCar(){
System.out.println("Brand: " + this.brand +"\n"+
"Body: " + this.body +"\n" +
"Wheel: " + this.wheel + "\n");
}
}
Builer 接口:

/**
* Created by YanMing on 2017/5/20.
*/
public interface CarBuilder {
public void BuildeCarWheel();
public void BuildeCarBody();
public void BuildeCarBrand();
public Car FinishBuild();
}
BenzBuilder 代码:(FordBuilder省略)

/**
* Created by YanMing on 2017/5/20.
*/
public class BenzBuilder implements CarBuilder {

Car benz = new Car();

@Override
public void BuildeCarWheel() {
System.out.println("Benz Wheel building!");
benz.setCarWheel("Benz Wheel");
}

@Override
public void BuildeCarBody() {
System.out.println("Benz Body building!");
benz.setCarBody("Benz Body");
}

@Override
public void BuildeCarBrand() {
System.out.println("Benz Brand building!");
benz.setCarBrand("Benz Brand");
}

@Override
public Car FinishBuild() {
return benz;
}
}
Director代码:

/**
* Created by YanMing on 2017/5/20.
*/
public class CarDirector {
public void Construct(CarBuilder cb){
cb.BuildeCarBrand();
cb.BuildeCarBody();
cb.BuildeCarWheel();
}
}

在主类中调用代码:

/**
* Created by YanMing on 2017/5/20.
*/
public class BuilderPattern {
public static void main(String arrgs []){
CarDirector director = new CarDirector();
BenzBuilder benzBuilder = new BenzBuilder();
FordBuilder fordBuilder = new FordBuilder();

director.Construct(benzBuilder);

Car benz = benzBuilder.FinishBuild();
benz.showMyCar();
}
}
运行结果:



小思考:在我看来,建造者模式,每次只能返回一个对象。并且由于返回的对象和建造者模式是耦合的,如果我们想要多个Product对象,就必须实现Product类的Deep Copy。所以,我想能否将建造者函数内部的Product 改为传参,然后对引用对象进行加工呢?

就好像去饭店自带食材,因为厨师只有一份食材哈哈~

本文GitHub源码下载

P.S.文章不妥之处还望指正
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: