java設計模式學習筆記1-簡單工廠模式

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

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.解決辦法:採用抽象工廠模式,直接生產配套的產品.

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