java設計模式學習筆記3-建造者模式

使用建造者模式生產桌子,桌子有桌面和桌腿,生產完成後檢查桌腿數量與桌面需要的桌腿數量:

客戶負責創建具體的建造者對象,再把建造者對象交給導演,導演控制具體建造者穿建示例對象,最後,建造者返回示例對象;

實現了導演者與具體建造者的解耦,根據傳入的具體建造者的不同,導演者可以控制具體建造者創建不同的示例對象:

1.產品

/**
 * 建造者模式-產品product 
 */
@Data
public class Desk {

    /**
     * 桌面
     */
    private String deskTop;

    /**
     * 桌腿
     */
    private String deskLeg;
}

2.抽象建造者:

/**
 * 建造者模式-抽象建造者 
 */
public interface BuilderInterface {

    void buildDeskTop();

    void buildDeskLeg();

    Desk getDesk();
}

3.具體建造者

/**
 * 建造者模式-具體建造者 
 */
@Slf4j
public class ConCreateBuilder implements BuilderInterface {

    private Desk desk = new Desk();

    @Override
    public void buildDeskTop() {
        log.info("開始造桌面");
        desk.setDeskTop("大理石桌面");
    }

    @Override
    public void buildDeskLeg() {
        log.info("開始造桌腿");
        desk.setDeskLeg("原木桌腿");
    }

    @Override
    public Desk getDesk() {
        log.info("桌子製造完畢出去吧");
        return desk;
    }
}

4.導演

/**
 * 建造者模式-導演 
 */
@Slf4j
public class Director {

    /**
     * 持有當前需要使用的建造器對象
     */
    private BuilderInterface builderInterface;

    /**
     * 構造方法,傳入建造器對象
     *
     * @param builderInterface 建造器對象
     */
    public Director(BuilderInterface builderInterface) {
        log.info("傳入建造器對象,構造導演對象");
        this.builderInterface = builderInterface;
    }

    /**
     * 產品構造方法,負責調用各個零件建造方法
     */
    public void productDesk() {
        log.info("導演開始調用創造方法");
        builderInterface.buildDeskTop();
        builderInterface.buildDeskLeg();
    }
}

5.測試

/**
 * 建造者模式測試 
 */
@Slf4j
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = FourApplication.class, properties = { "DEPLOY_ENV=unit" })
@WebAppConfiguration
public class ProductTypeTest {

    @Test
    public void productTest() {
        log.info("開始造桌子>>>>>>");
        BuilderInterface builderInterface = new ConCreateBuilder();
        Director director = new Director(builderInterface);
        director.productDesk();
        Desk desk = builderInterface.getDesk();
        log.info("桌子建好了:{}", JSON.toJSON(desk));
    }
}

6.測試結果:

7.注意:建造模式用於處理如何建造示例對象; 抽象工廠模式用於處理如何獲取示例對象;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章