1. 程式人生 > >建造者模式:設計角度重溫遊戲中的角色

建造者模式:設計角度重溫遊戲中的角色

應用場景

 假設現在我們要設計DNF中的人物角色(鬼劍士、神槍手、魔法師、聖騎士、格鬥家)。然而,利用面對物件的思想,必須先從實體入手,每一個角色都包含各種裝備、武器、配飾,這些就當做要建造的零件,然後把裝備零件組裝起來,那麼就是最終人物角色的能量值,然後它就將造成不同的傷害。

  回憶過程:假設要建立一個角色,先構建裝備零件,控制者控制組裝裝備零件,構建者得到專屬角色。

簡述實現

 建造者模式:將一部負責物件的構建分為許多小物件的構建,最後在整合構建的模式。

  建造者模式適用於構造一個很複雜的物件,將其拆分成很多個小物件,方便管理物件。

  

  控制者(Director):控制整個組合過程,通過呼叫Builder內部的各元件的生成方法進行組裝。

  構建者(Builder):構建者介面,定義構建各部件的方法。

  實際構建者(ConcreteBuilder):具體構建出各部件物件,獲得構造結構。

  成品(Product):成品類。

  成品類(Car)

public class Car {
    //車頭
    private CarHead carHead;
    //車身
    private CarBody carBody;
    //車輪
    private Wheel wheel;
    
    public Car() {}
    
    public Car(CarHead carHead, CarBody carBody, Wheel wheel) {
        super();
        this.carHead = carHead;
        this.carBody = carBody;
        this.wheel = wheel;
    }
    
    public void run(){
        System.out.println("車開著 嘟嘟嘟嘟!!!");
    }

    public CarHead getCarHead() {
        return carHead;
    }
    public void setCarHead(CarHead carHead) {
        this.carHead = carHead;
    }
    public CarBody getCarBody() {
        return carBody;
    }
    public void setCarBody(CarBody carBody) {
        this.carBody = carBody;
    }
    public Wheel getWheel() {
        return wheel;
    }
    public void setWheel(Wheel wheel) {
        this.wheel = wheel;
    }
}

class CarHead{
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

class CarBody{
    private String name;
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}

class Wheel{
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

成品類

抽象構建者(Builder)

public interface Builder {
    //構造車頭
    void builderCarHead();
    //構造車身
    void builderCarBody();
    //構造輪子
    void builderWheel();
    //得到構建成品
    Car getCar();
}

實際構造者(CarBuilder)

public class CarBuilder implements Builder{
    Car car=new Car();

    @Override
    public void builderCarHead() {
        System.out.println("構建車頭!");
        car.setCarHead(new CarHead());
    }

    @Override
    public void builderCarBody() {
        System.out.println("構建車身!");
        car.setCarBody(new CarBody());
    }

    @Override
    public void builderWheel() {
        System.out.println("構建輪子!");
        car.setWheel(new Wheel());
    }
    
    public Car getCar(){
        return this.car;
    }
}

控制者(Director)

public class Director {
    private Builder builder;
    
    public Director(Builder builder) {
        System.out.println("控制車組裝");
        this.builder=builder;
        builder.builderCarHead();
        builder.builderCarBody();
        builder.builderWheel();
    }
}

客戶端(Client)

public class Client {
    public static void main(String[] args) {
        //製造零件
        Builder builder=new CarBuilder();
        //組裝汽車
        Director director=new Director(builder);
        //獲得製造結果
        Car car=builder.getCar();
        //汽車開始跑
        car.run();
    }
}

構建者模式與工廠模式極為相似,建議還是用應用場景去記。而構建者模式相比於工廠模式它多了一個組裝過程,而它的應用場景主要是用於構造一個複雜的物件,而工廠模式主要是專注於生產產品或者生產產品系列。當然,他們也可以結合,工廠模式專注於生產產品系列,而構建者模式專注於控制產品的構造流程,從而製造一個複雜的物件。對於設計模式不要拘泥於文字,主要是一種思想在我們運用的時候信手拈來。