工厂方法模式
工厂方法模式:Factory Method
事物是发展的,随着事物的不断发展,原有的对象会随着发展不断变化,或增或减。
工厂方法模式提供的一种封装机制,隔离出了那些易变动的对象。这个时候需求的变动不再影响之前的对象的变动了。
一、工厂方法模式角色
- 1、抽象产品:所有子类产品的基类,给出一个抽象接口或抽象类。
- 2、具体产品:继承抽象产品的属性、方法,具有某种特质的具体产品。
- 3、抽象工厂:包含产品的核心业务逻辑,给出一个抽象接口或抽象类。
- 4、具体工厂:继承抽象工厂的具体工厂,实现具体业务逻辑。
二、工厂方法使用场景
1、无法预知对象确切类别及其依赖关系时。
2、为了能够扩展代码中的组件时。
3、复用现有对象节省系统资源时。
三、工厂方法案例及代码实现
华为是一家集团,包含有手机、网络、手表、路由、汽车等等产业。在一开始的华为并没有汽车业务,它的起家是从网络交换机开始的。那么当我们在代码中定义华为时,是无法预知它未来的业务及其依赖关系的,此时就适用于工厂方法模式。
对应的工厂方法模式角色如下:
1、抽象产品:华为产品
2、具体产品:华为手表、华为汽车、华为路由
3、抽象工厂:华为工厂
4、具体工厂:华为手机工厂、华为汽车工厂、华为路由工厂
3.1 工厂方法代码实现
1、示例图/UML图
2、抽象产品
定义一个产品接口,为所有产品的父类:HuaWeiProduct.java
,其定义了常量:MANUFACTURER
(制造商)=HuaWei
;抽象接口:getManufacturer()
获取制造商;getProductName()
获取具体产品名称
public interface HuaWeiProduct {
/**
* 华为产品制造商必定都是华为
**/
String MANUFACTURER = "HuaWei";
/**
* 通过产品可以获取制造商
**/
String getManufacturer();
/**
* 通过产品可以获取产品名称
**/
String getProductName();
}
3、具体产品
1、手机产品
华为产品的子类,实现抽象产品的抽象接口:HuaWeiPhone.java
。
public class HuaWeiPhone implements HuaWeiProduct {
@Override
public String getManufacturer() {
return HuaWeiProduct.MANUFACTURER;
}
@Override
public String getProductName() {
return "华为手机";
}
}
手机在未来阶段会有多种类型,这里建立Mate产品和Nova产品,继承手机产品类,重写getProductName()
方法。
public class HuaWeiMatePhone extends HuaWeiPhone{
@Override
public String getProductName() {
return super.getProductName() + ":Mate系列手机";
}
}
public class HuaWeiNovaPhone extends HuaWeiPhone{
@Override
public String getProductName() {
return super.getProductName() + ":Nova系列手机";
}
}
2、汽车产品
华为产品的子类,实现抽象产品的抽象接口:HuaWeiCar.java
。
public class HuaWeiCar implements HuaWeiProduct {
@Override
public String getManufacturer() {
return HuaWeiProduct.MANUFACTURER;
}
@Override
public String getProductName() {
return "华为汽车";
}
}
汽车在未来阶段会有多种类型,目前只有“问界”,继承汽车产品类,重写getProductName()
方法。
public class HuaWeiWenJieCar extends HuaWeiCar{
@Override
public String getProductName() {
return super.getProductName() + ":问界汽车";
}
}
4、抽象工厂
定义一个工厂接口,工厂存在的意义:生产。HuaWeiFactory.java
,抽象接口:produce()
生产产品
public interface HuaWeiFactory<T> {
/**
* 生产方法
**/
T produce(Class<? extends T> classz);
}
5、具体工厂
1、手机工厂
实现抽象工厂的方法,是实际创建产品的地方,含有具体创建产品的业务逻辑。这里实现了抽象工厂的produce()
方法,通过反射创建对象。
public class HuaWeiPhoneFactory implements HuaWeiFactory<HuaWeiPhone> {
/**
* 华为手机工厂生产手机
**/
@Override
public HuaWeiPhone produce(Class<? extends HuaWeiPhone> classz) {
try {
return classz.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
return null;
}
}
}
2、汽车工厂
实现抽象工厂的方法,是实际创建产品的地方,含有具体创建产品的业务逻辑。这里实现了抽象工厂的produce()
方法,通过反射创建对象。
public class HuaWeiCarFactory implements HuaWeiFactory<HuaWeiCar> {
/**
* 华为汽车工厂生产汽车
**/
@Override
public HuaWeiCar produce(Class<? extends HuaWeiCar> classz) {
try {
return classz.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
return null;
}
}
}
6、通过工厂创建对象
1、实例化手机、汽车工厂:HuaWeiPhoneFactory
,HuaWeiCarFactory
。
2、通过工厂的produce()
方法,传入具体需要创建的产品。
3、输出具体产品的制造商与产品名称。
public static void main(String[] args) {
//华为手机工厂
HuaWeiFactory<HuaWeiPhone> huaWeiPhoneFactory = new HuaWeiPhoneFactory();
//华为汽车工厂
HuaWeiFactory<HuaWeiCar> huaWeiCarFactory = new HuaWeiCarFactory();
HuaWeiProduct huaWeiMateProduct = huaWeiPhoneFactory.produce(HuaWeiMatePhone.class);
HuaWeiProduct huaWeiNovaProduct = huaWeiPhoneFactory.produce(HuaWeiNovaPhone.class);
HuaWeiProduct huaWeiWenJieProduct = huaWeiCarFactory.produce(HuaWeiWenJieCar.class);
System.out.println(huaWeiMateProduct.getManufacturer()+huaWeiMateProduct.getProductName());
System.out.println(huaWeiNovaProduct.getManufacturer()+huaWeiNovaProduct.getProductName());
System.out.println(huaWeiWenJieProduct.getManufacturer()+huaWeiWenJieProduct.getProductName());
}
结果如下:
HuaWei华为手机:Mate系列手机
HuaWei华为手机:Nova系列手机
HuaWei华为汽车:问界汽车