定义
定义一个用于创建对象的接口,让子类决定实例化哪个类。
使用场景
复杂对象的创建可以使用工厂模式,用new就可以完成的对象的创建就无需使用工厂模式。
UML类图
一共四个角色,即四大模块:
- 一是抽象工厂Factory,工厂方法模式的核心;
- 二是具体工厂ConcreteFactory,实现了具体的业务逻辑;
- 三是抽象产品Product,是工厂方法模式所创建的产品父类;
- 四是具体产品ConcreteProduct,是抽象产品的某个具体产品对象。
代码实现
package com.tcl.tvweishi.activity;
/**
* Desc
*
* @author Agg
* @date 2020/07/07
*/
public class Client {
/**
* Test Method
*
* @param args String
*/
public static void main(String[] args) {
ConcreteFactory factory = new ConcreteFactory();
ConcreteProductA productA = factory.createProduct(ConcreteProductA.class);
productA.method();
ConcreteProductB productB = factory.createProduct(ConcreteProductB.class);
productB.method();
}
/**
* 抽象产品
*/
public static abstract class Product {
public abstract void method();
}
/**
* 具体产品 A
*/
public static class ConcreteProductA extends Product {
@Override
public void method() {
System.out.println("Product A");
}
}
/**
* 具体产品 B
*/
public static class ConcreteProductB extends Product {
@Override
public void method() {
System.out.println("Product B");
}
}
/**
* 抽象工厂
*/
public static abstract class Factory {
public abstract <T extends Product> T createProduct(Class<T> clz);
}
/**
* 具体工厂:此处采用的是多工厂方法模式中的反射方式,可以更简洁地生产具体产品对象。
* 当然,你也可以使用常规方式,针对于每一种产品都建立一个工厂类
*/
public static class ConcreteFactory extends Factory {
@Override
public <T extends Product> T createProduct(Class<T> clz) {
Product product = null;
try {
product = (Product) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T) product;
}
}
}
总结
工厂方法模式的优势还是比较明显的。一是降低了对象之间的耦合性;二是其依赖于抽象的架构,将实例化的任务交给子类去完成,有非常好的扩展性。