- 建造者模式(Builder Pattern) 也叫生成器模式,其定義以下: Separate the construction of a complex object from its representation so that the same construction process can create different representations.(將一個複雜對象的構建與他的表示分離,是得一樣的構建過程能夠建立不一樣的表示。) 在建造者模式中,有以下4個角色:
- Product產品類 一般是實現了模板方法模式,也就是有模板方法和基本方法。
- Builder抽象建造者 規範產品的組件,通常是由子類實現。例子中的CarBuilder就屬於抽象建造者。
- ConcreteBuilder具體建造者 實現抽象類定義的全部方法,而且返回一個組建好的對象。
- Director導演類 負責安排已有模塊的順序,而後告訴Builder開始建造,在上面的例子中就是咱們的老大,xx公司找到老大,說我要這個或那個類型的車輛模型,而後老大就把命令傳遞給我,我和個人團隊就開始拼命的建造,因而一個項目建設完畢了。 建造者模式的通用源碼也比較簡單,先看Product類,一般它是一個組合或繼承(如模板方法模式)產生的類
package com.wzl.fea;
import java.util.ArrayList;
abstract class CarBuilder {
public abstract void setSequence(ArrayList<String> sequence);
public abstract CarModel getCarModel();
}
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")) {
//若是是engine boom關鍵字
this.engineBoom();
}
}
}
final public void setSequence(ArrayList sequence){
this.sequence = sequence;
}
}
class BenzModel extends CarModel {
protected void alarm() {
System.out.println("奔馳車的喇叭聲音是這個樣子的...");
}
protected void engineBoom() {
System.out.println("奔馳車的引擎是這個聲音的...");
}
protected void start() {
System.out.println("奔馳車跑起來是這個樣子的...");
}
protected void stop() {
System.out.println("奔馳車應該這樣停車...");
}
}
class BMWModel extends CarModel {
protected void alarm() {
System.out.println("寶馬車的喇叭聲音是這個樣子的...");
}
protected void engineBoom() {
System.out.println("寶馬車的引擎是這個聲音的...");
}
protected void start() {
System.out.println("寶馬車跑起來是這個樣子的...");
}
protected void stop() {
System.out.println("寶馬車應該這樣停車...");
}
}
class BenzBuilder extends CarBuilder {
private BenzModel benz = new BenzModel();
@Override
public CarModel getCarModel() {
return this.benz;
}
@Override
public void setSequence(ArrayList<String> sequence) {
this.benz.setSequence(sequence);
}
}
class BMWBuilder extends CarBuilder {
private BMWModel bmw = new BMWModel();
@Override
public CarModel getCarModel() {
return this.bmw;
}
@Override
public void setSequence(ArrayList<String> sequence) {
this.bmw.setSequence(sequence);
}
}
class CarDirector {
private ArrayList<String> sequence = new ArrayList<>();
private BenzBuilder benzBuilder = new BenzBuilder();
private BMWBuilder bmwBuilder = new BMWBuilder();
public BenzModel getABenzModel(){
this.sequence.clear();
this.sequence.add("start");
this.sequence.add("stop");
this.benzBuilder.setSequence(this.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(this.sequence);
return (BenzModel)this.benzBuilder.getCarModel();
}
public BMWModel getCBMWModel(){
this.sequence.clear();
this.sequence.add("alarm");
this.sequence.add("start");
this.sequence.add("stop");
this.bmwBuilder.setSequence(this.sequence);
return (BMWModel)this.bmwBuilder.getCarModel();
}
public BMWModel getDBMWModel(){
this.sequence.clear();
this.sequence.add("start");
this.bmwBuilder.setSequence(this.sequence);
return (BMWModel)this.benzBuilder.getCarModel();
}
}
public class EpCarBuilder {
public static void main(String[] args) {
ArrayList<String> sequence = new ArrayList<String>();
sequence.add("engine boom");
sequence.add("start");
sequence.add("stop");
BenzBuilder benzBuilder = new BenzBuilder();
benzBuilder.setSequence(sequence);
BenzModel benz = (BenzModel)benzBuilder.getCarModel();
benz.run();
CarDirector director = new CarDirector();
//1萬輛A類型的奔馳車
for(int i=0;i<2;i++){
director.getABenzModel().run();
}
//100萬輛B類型的奔馳車
for(int i=0;i<3;i++){
director.getBBenzModel().run();
}
//1000萬輛C類型的寶馬車
for(int i=0;i<5;i++){
director.getCBMWModel().run();
}
}
}