抽象工厂模式简介
抽象工厂模式 :
Abstract Factory Pattern
是一种创建型模式
。
核心 :“族”的概念,一组具有相同风格或主题的对象,通过同一个工厂接口来创建这个产品族中的对象。
感觉 : 就是对工厂方法模式的一种扩展,由原来的创建一种产品对象,扩展为创建多种产品对象。
主要角色
抽象产品 :
对产品的抽象
,例如 : 手机接口、电脑接口
具体产品 :具体的某个产品
,例如 : 小米手机、华为手机、小米电脑、华为电脑
抽象工厂 :定义了一组方法,用于创建 产品的对象,就是一个接口
;例如 : 电子工厂
具体工厂 :实现了创建产品的方法,真正会创建对象的,就是接口的实现类
;例如 : 小米工厂
场景介绍
1、有一个手机接口、电脑接口;
2、具体的产品类 : 小米手机、华为手机、小米电脑、华为电脑;
3、有一个抽象工厂类接口 : 电子产品工厂,有两个方法 : 造手机方法、造电脑方法;
4、具体的工厂类 : 小米工厂,华为工厂。
UML 类图
案例代码
抽象产品接口
手机接口
public interface Phone {
void call();
}
电脑接口
public interface Computer {
void work();
}
具体产品类
小米手机
public class XiaomiPhone implements Phone{
@Override
public void call() {
System.out.println("小米手机打电话");
}
}
华为手机
public class HuaweiPhone implements Phone{
@Override
public void call() {
System.out.println("华为手机打电话");
}
}
小米电脑
public class XiaomiComputer implements Computer{
@Override
public void work() {
System.out.println("小米电脑办公");
}
}
华为电脑
public class HuaweiComputer implements Computer{
@Override
public void work() {
System.out.println("华为电脑办公");
}
}
抽象工厂接口
public interface TechnologyFactory {
/**
* 创建手机对象
* @return
*/
Phone createPhone();
/**
* 创建电脑对象
* @return
*/
Computer createComputer();
}
具体工厂
小米工厂
public class XiaomiFactory implements TechnologyFactory{
@Override
public Phone createPhone() {
return new XiaomiPhone();
}
@Override
public Computer createComputer() {
return new XiaomiComputer();
}
}
华为工厂
public class HuaweiFactory implements TechnologyFactory{
@Override
public Phone createPhone() {
return new HuaweiPhone();
}
@Override
public Computer createComputer() {
return new HuaweiComputer();
}
}
测试类
public class TestAbstractFactory {
public static void main(String[] args) {
TechnologyFactory technologyFactory = null;
// String brand = "huawei";
String brand = "xiaomi";
// 根据品牌选择工厂
if ("huawei".equals(brand)) {
technologyFactory = new HuaweiFactory();
} else if ("xiaomi".equals(brand)) {
technologyFactory = new XiaomiFactory();
}else{
System.out.println("暂不支持该品牌");
}
// 由工厂来创建手机和电脑
Phone phone = technologyFactory.createPhone();
phone.call();
Computer computer = technologyFactory.createComputer();
computer.work();
}
}