工厂模式分为工厂方法模式和抽象工厂模式两类
一、工厂方法模式
1、定义
为创建一组相关的对象提供一个接口,无需制定他们的具体类
2、类图
-
抽象工厂: 定义接口,提供创建产品的方法
-
具体工厂:实现具体的创建逻辑
-
抽象产品: 定义接口,提供产品相关方法
-
具体产品,最终所创建的具体产品的对象
3、实例
(1)抽象工厂
/**
* @Description 抽象工厂
*/
public abstract class Factory {
/**
* 用来创建产品
* @param <T>
* @return
*/
public abstract <T extends Product> T createProduct(Class<T> tClass);
}
(2)具体工厂
public class ConcreteFactory extends Factory {
/**
* 通过反射创建不同对象
* @param tClass
* @param <T>
* @return
*/
public <T extends Product> T createProduct(Class<T> tClass) {
Product product = null;
try {
product = (Product) Class.forName(tClass.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T) product;
}
}
(3)抽象产品
/**
* @Description 抽象产品
*/
public abstract class Product {
/**
* 由具体的产品实现
*/
public abstract void method();
}
(4)具体产品
public class ProductA extends Product {
@Override
public void method() {
System.out.print("A产品");
}
}
(5)创建
public class FactoryTest {
public static void main(String[] args) {
Factory factory = new ConcreteFactory();
ProductA productA = factory.createProduct(ProductA.class);
productA.method();
}
}
4、优点
-
结构清晰、易于拓展(添加新类型简单)
-
屏蔽产品类,只关注产品的创建
5、应用场景
用于需要创建对象,并且需要,需要考虑是否有必要增加工厂类进行对象创建
6、工厂方法模式拓展
1、将工厂抽象类和实现类简化为静态方法
public static <T extends Product> T createProduct(Class<T> tClass) {
Product product = null;
try {
product = (Product) Class.forName(tClass.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T) product;
}
2、提供多个工厂实现类用于创建不同的产品
二、抽象工厂模式
1、定义
为创建一组相关或相互依赖的对象提供一个接口,而不需要指定他们具体类
2、类图
-
AbstractFactory:抽象工厂,声明一组用于创建产品的方法,每个方法对应一种产品
-
ConcreteFactory:具体工厂,实现了抽象工厂中创建产品的方法
-
AbstractProduct:抽象产品角色,为每种产品声明接口
-
ConcreteProduct:具体产品角色,定义具体产品对象
3、实例
(1)抽象工厂
/**
* @Description 抽象工厂
*/
public abstract class Factory {
/**
* 用来创建产品
* @return
*/
public abstract ProductA createProductA();
public abstract ProductB createProductB();
}
(2)具体工厂
public class ConcreteFactory extends Factory {
@Override
public ProductA createProductA() {
return new ProductA();
}
@Override
public ProductB createProductB() {
return new ProductB();
}
}
(3)抽象产品
/**
* @Description 抽象产品
*/
public abstract class Product {
/**
* 由具体的产品实现
*/
public abstract void method();
}
(4)具体产品
public class ProductA extends Product {
@Override
public void method() {
System.out.print("A产品");
}
}
public class ProductB extends Product {
@Override
public void method() {
System.out.print("B产品");
}
}
4、优缺点
-
接口和实现的分离,实现解耦
-
拓展不方便,每次新增产品类,都需要修改工厂类,违反了开闭原则
三、两者对比
1、工厂方法模式:一个工厂生产一种产品
2、抽象工厂模式:一个工厂可以生产多种产品