java设计模式-工厂模式(下)

接java设计模式-工厂模式(上)

抽象工厂模式

针对耳机的生产需求,我们可以知道,刚才的工厂已经不满足了,因为只是生产一类产品-手机,但是现在我们需要的工厂类是要生产一个产品族(手机和耳机)。

每个手机产品的耳机要求可以进行变动,可以是无线的,也可以是有线的。

模式结构

  • AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法,每一个方法对应一种产品
  • ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。
  • AbstractProduct(抽象产品):它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。
  • ConcreteProduct(具体产品):它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。

我们依然保留开始的AbstractPhone类, 以及一加和真我两个具体产品类。(YijiaPhone,ZhenwoPhone)

在此基础上,我们再定义一个耳机的抽象产品类 以及 两个耳机具体产品类(有线,无线)。

/**
 * 耳机的抽象产品类
 *
 * @author jiangkd
 * @date 2023/7/28 15:17:28
 */
public abstract class AbstractHeadset {

    /**
     * 耳机类型,有线无线
     */
    public abstract void type();

    /**
     * 音质
     */
    public abstract void tone();

}

两个耳机具体实现类

/**
 * 耳机具体实现类, 有线耳机
 *
 * @author jiangkd
 * @date 2023/7/28 15:19:54
 */
@Slf4j
public class YouxianHeadset extends AbstractHeadset {

    @Override
    public void type() {
        log.info("我是有线耳机!!!");
    }

    @Override
    public void tone() {
        log.info("有线耳机, 音质杠杠的!!!");
    }
}
/**
 * 耳机具体实现类, 无线耳机
 *
 * @author jiangkd
 * @date 2023/7/28 15:21:14
 */
@Slf4j
public class WuxianHeadset extends AbstractHeadset {

    @Override
    public void type() {
        log.info("我是无线耳机!!!");
    }

    @Override
    public void tone() {
        log.info("无线耳机, 音质妥妥的!!!");
    }

}

定义一个工厂类,用来生产一族产品(手机和耳机)

/**
 * 抽象工厂类
 *
 * @author jiangkd
 * @date 2023/7/28 15:23:13
 */
public abstract class AbstractFactory {

    /**
     * 生产手机
     * @return
     */
    public abstract AbstractPhone createPhone();

    /**
     * 生产耳机
     * @return
     */
    public abstract AbstractHeadset createHeadset();

}

一加手机的生产实现类,一加手机 + 无线耳机

/**
 * 一加手机产品族工厂具体实现类
 *
 * @author jiangkd
 * @date 2023/7/28 15:34:46
 */
public class YijiaFactory extends AbstractFactory {

    @Override
    public AbstractPhone createPhone() {
        return new YijiaPhone();
    }

    /**
     * 一加手机配无线耳机
     * @return
     */
    @Override
    public AbstractHeadset createHeadset() {
        return new WuxianHeadset();
    }

}

然后是真我手机的生产实现类,真我手机 + 有线耳机

/**
 * 真我手机产品族工厂具体实现类
 *
 * @author jiangkd
 * @date 2023/7/28 15:44:17
 */
public class ZhenwoFactory extends AbstractFactory {

    @Override
    public AbstractPhone createPhone() {
        return new ZhenwoPhobe();
    }

    /**
     * 有线耳机
     *
     * @return
     */
    @Override
    public AbstractHeadset createHeadset() {
        return new YouxianHeadset();
    }
}

测试一下

/**
 * @author jiangkd
 * @date 2023/7/28 15:45:02
 */
@Slf4j
public class DemoTest {

    public static void main(String[] args) {

        // 生产 一加手机 + 耳机
        final AbstractFactory yijiaFactory = new YijiaFactory();
        final AbstractPhone yijiaPhone = yijiaFactory.createPhone();
        final AbstractHeadset yijiaHeadset = yijiaFactory.createHeadset();

        yijiaPhone.brand();
        yijiaPhone.color();

        yijiaHeadset.type();
        yijiaHeadset.tone();

        log.info("--------------------------------");

        // 生产 真我手机 + 耳机
        final AbstractFactory zhenwoFactory = new ZhenwoFactory();
        final AbstractPhone zhenwoPhone = zhenwoFactory.createPhone();
        final AbstractHeadset zhenwoHeadset = zhenwoFactory.createHeadset();

        zhenwoPhone.brand();
        zhenwoPhone.color();

        zhenwoHeadset.type();
        zhenwoHeadset.tone();

    }

}

执行结果记录日志:

15:50:20.523 [main] INFO demo.basic.example.design_patterns.gcms.YijiaPhone - 品牌, 一加手机!!!
15:50:20.526 [main] INFO demo.basic.example.design_patterns.gcms.YijiaPhone - 黑色!!!
15:50:20.526 [main] INFO demo.basic.example.design_patterns.gcms.cxgcms.WuxianHeadset - 我是无线耳机!!!
15:50:20.526 [main] INFO demo.basic.example.design_patterns.gcms.cxgcms.WuxianHeadset - 无线耳机, 音质妥妥的!!!
15:50:20.526 [main] INFO demo.basic.example.design_patterns.gcms.cxgcms.DemoTest - --------------------------------
15:50:20.527 [main] INFO demo.basic.example.design_patterns.gcms.ZhenwoPhobe - 品牌, 真我手机!!!
15:50:20.527 [main] INFO demo.basic.example.design_patterns.gcms.ZhenwoPhobe - 白色!!!
15:50:20.527 [main] INFO demo.basic.example.design_patterns.gcms.cxgcms.YouxianHeadset - 我是有线耳机!!!
15:50:20.527 [main] INFO demo.basic.example.design_patterns.gcms.cxgcms.YouxianHeadset - 有线耳机, 音质杠杠的!!!

你可能感兴趣的:(java,#,设计模式,java,设计模式,开发语言)