使用建造者模式生產桌子,桌子有桌面和桌腿,生產完成後檢查桌腿數量與桌面需要的桌腿數量:
客戶負責創建具體的建造者對象,再把建造者對象交給導演,導演控制具體建造者穿建示例對象,最後,建造者返回示例對象;
實現了導演者與具體建造者的解耦,根據傳入的具體建造者的不同,導演者可以控制具體建造者創建不同的示例對象:
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.注意:建造模式用於處理如何建造示例對象; 抽象工廠模式用於處理如何獲取示例對象;