今天学习了设计模式中的建造者模式(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 改为传参,然后对引用对象进行加工呢?
就好像去饭店自带食材,因为厨师只有一份食材哈哈~
P.S.文章不妥之处还望指正