欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java设计模式学习笔记1-简单工厂模式

程序员文章站 2024-01-23 18:09:10
...

使用工厂模式生产桌子,桌子有桌面和桌腿,生产完成后检查桌腿数量与桌面需要的桌腿数量:

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.测试结果:

java设计模式学习笔记1-简单工厂模式

7.存在问题: 随意传入桌面和桌腿的参数,可能导致两个零件对不上! 不仅产品型号不同,接口数量也对不上!

java设计模式学习笔记1-简单工厂模式 java设计模式学习笔记1-简单工厂模式

8.解决办法:采用抽象工厂模式,直接生产配套的产品.