使用工廠模式生產桌子,桌子有桌面和桌腿,生產完成後檢查桌腿數量與桌面需要的桌腿數量:
1.抽象產品
/**
* 抽象產品-桌面
*/
public interface DeskTop {
/**
* 檢查桌面
*/
void checkTop();
}
/**
* 抽象產品-桌腿
*/
public interface DeskLeg {
/**
* 檢查桌腿
*/
void checkLeg();
}
2.具體產品
/**
* 具體產品-石頭桌腿
*/
@Slf4j
public class StoneDeskLeg implements DeskLeg {
private int legNumber;
public StoneDeskLeg(int legNumber) {
this.legNumber = legNumber;
}
@Override
public void checkLeg() {
log.info("石頭桌子的桌腿數量:{}", legNumber);
}
}
/**
* 具體產品-石頭桌面
*
* @author zhangshiwei
* @since 2019年4月26日 上午10:30:30
*/
@Slf4j
public class StoneDeskTop implements DeskTop {
private int needLeg;
public StoneDeskTop(int needLeg) {
this.needLeg = needLeg;
}
@Override
public void checkTop() {
log.info("石頭桌面需要的桌腿數量:{}", needLeg);
}
}
/**
* 具體產品-木頭桌腿
*/
@Slf4j
public class WoodDeskLeg implements DeskLeg {
private int legNumber;
public WoodDeskLeg(int legNumber) {
this.legNumber = legNumber;
}
@Override
public void checkLeg() {
log.info("木頭桌子的桌腿數量:{}", legNumber);
}
}
/**
* 具體產品-木頭桌面
*/
@Slf4j
public class WoodDeskTop implements DeskTop {
private int needLeg;
public WoodDeskTop(int needLeg) {
this.needLeg = needLeg;
}
@Override
public void checkTop() {
log.info("木頭桌面需要的桌腿數量:{}", needLeg);
}
}
3.生產工廠
/**
* 桌腿工廠
*/
public class DeskLegFactory {
public static DeskLeg productDeskLeg(int deskType) {
DeskLeg deskLeg = null;
if (deskType == 1) {
deskLeg = new StoneDeskLeg(4);
} else if (deskType == 2) {
deskLeg = new StoneDeskLeg(3);
}
return deskLeg;
}
}
/**
* 桌面工廠
*/
public class DeskTopFactory {
public static DeskTop productDeskTop(int deskType) {
DeskTop deskTop = null;
if (deskType == 1) {
deskTop = new StoneDeskTop(4);
} else if (deskType == 2) {
deskTop = new WoodDeskTop(3);
}
return deskTop;
}
}
4.生產桌子的工人
/**
* 生產桌子的工人
*/
public class DeskWorker {
private DeskTop deskTop;
private DeskLeg deskLeg;
public void productDesk(int deskTopType, int deskLegType) {
// 準備工作
// 獲取桌面和桌腿
makeDesk(deskTopType, deskLegType);
// 組裝
// 交付
}
private void makeDesk(int deskTopType, int deskLegType) {
// 生產零件
this.deskTop = DeskTopFactory.productDeskTop(deskTopType);
this.deskLeg = DeskLegFactory.productDeskLeg(deskLegType);
// 檢查零件
deskTop.checkTop();
deskLeg.checkLeg();
}
}
5.測試傳入參數,生產桌子:
/**
* 簡單工廠模式測試
*/
@Slf4j
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
@WebAppConfiguration
public class SimpleFactoryTest {
@Test
public void productTest() {
log.info("桌子生產---開始!");
DeskWorker deskWorker = new DeskWorker();
deskWorker.productDesk(1, 1);
log.info("桌子生產---結束!");
}
}
6.測試結果:
7.存在問題: 隨意傳入桌面和桌腿的參數,可能導致兩個零件對不上! 不僅產品型號不同,接口數量也對不上!
8.解決辦法:採用抽象工廠模式,直接生產配套的產品.