抽象工厂模式
针对耳机的生产需求,我们可以知道,刚才的工厂已经不满足了,因为只是生产一类产品-手机,但是现在我们需要的工厂类是要生产一个产品族(手机和耳机)。
每个手机产品的耳机要求可以进行变动,可以是无线的,也可以是有线的。
模式结构
- 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 - 有线耳机, 音质杠杠的!!!