一:工厂方法模式
1.抽象产品:所有子类产品的基类,给出一个抽象接口或者抽象类
2.具体产品:继承抽象产品的属性,方法,具有某种特质的具体产品
3.抽象工厂:包含产品的核心业务逻辑,写一个抽象接口和抽象类
4.具体工厂:继承抽象工厂的具体工厂,实现具体业务逻辑
二、工厂方法使用场景
1、无法预知对象确切类别及其依赖关系时。
2、为了能够扩展代码中的组件时。
3、复用现有对象节省系统资源时。
三、对应的工厂方法模式角色
1、抽象产品:小米产品
2、具体产品:小米手机 平板 手表
3、抽象工厂:小米工厂
4、具体工厂:小米手机工厂 平板工厂 手表工厂
四、示例图、UML
五、抽象产品
定义一个产品接口,为所有产品的父类:XiaoMiProduct.java ,其定义了常量 MANUFACTUERER(制造商)= Apple,抽象接口:getManufacturer()获取制造商,getProductName()获取具体产品名称。
六、具体产品
1.手机产品
小米产品的子类,实现抽象产品的抽象接口 XiaoMiPhone.java
可能产品类型很多,所以确定不了,这里建立两个系列的手机 小米12 小米13系列,继承手机产品,重写getProductName()方法
2.平板产品
小米产品的子类,实现抽象产品的抽象接口 XiaoMiIpad.java
3.抽象工厂
定义一个工厂接口,工厂存在的意义:生产 XiaoMiFactory.java 抽象接口:produce.java 生产产品
七、具体工厂
1.手机工厂
实现抽象工厂的方法,是实现创建产品的地方,含有具体创建产品的业务逻辑。实现抽象工厂produce()方法,通过反射创建对象。
public class XiaoMiPhoneFactory implements XiaoMiFactory<XiaoMiPhone> {
/**
* 小米工厂生产手机
* @param claszz
* @return
*/
@Override
public XiaoMiPhone produce(Class<? extends XiaoMiPhone> claszz) {
try {
return claszz.newInstance();
}catch (InstantiationException | IllegalAccessException e){
e.printStackTrace();
return null;
}
}
}
2.平板工厂
实现抽象工厂的方法,就是创建产品的地方,含有具有创建产品的业务逻辑,实现抽象工厂的product()方法,通过反射创建对象。
public class IpadFactory implements XiaoMiFactory<IpadFactory>{
@Override
public IpadFactory produce(Class<? extends IpadFactory> claszz) {
try {
return claszz.newInstance();
}catch (InstantiationException | IllegalAccessException e){
e.printStackTrace();
return null;
}
}
}
八、通过工厂创建对象
1.实例化手机,平板工厂:XiaoMiPhoneFactory IpadFactory
2.通过工厂的producr()方法,传入具体需要创建的产品
3.输出具体产品的制造商和产品名称
@Test
void contextLoads() {
//小米手机工厂
XiaoMiFactory<XiaoMiPhone> phoneXiaoMiFactory = new XiaoMiPhoneFactory();
//平板工厂
XiaoMiFactory<XiaoMiIpad> ipadIpadFactory = new IpadFactory();
XiaoMiProduct product = phoneXiaoMiFactory.produce(XiaoMiPhone.class);
XiaoMiProduct product1 = ipadIpadFactory.produce(XiaoMiIpad.class);
System.out.println(product.getManufacturer() + product.getProductName());
System.out.println(product1.getManufacturer() + product1.getProductName());
}
结果: