定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
优点
- 良好的封装性,代码结构清晰。
- 扩展性非常优秀
- 屏蔽产品类
- 典型的解耦框架
使用场景
- 工厂方法模式是new一个对象的替代品,所以在所有需要生成多项的地方都可以使用,但是需要慎重地考虑是否需要增加一个工厂类进行管理,增加代码复杂度。
- 需要灵活的、可扩展的框架时,可以考虑采用工厂方法模式。
代码实现
package com.lidaxia.design.pattern.creational.factory;
/**
* @author lidaxia
* @version 1.0
* @date 2022/11/21 22:16
*/
public abstract class Product {
/**
* 产品类的公共方法
*/
public void method1() {
}
/**
* 抽象方法
*/
public abstract void method2();
}
package com.lidaxia.design.pattern.creational.factory;
/**
* @author lidaxia
* @version 1.0
* @date 2022/11/21 22:17
*/
public class ConcreteProduct1 extends Product{
@Override
public void method2() {
//业务逻辑
}
}
package com.lidaxia.design.pattern.creational.factory;
/**
* @author lidaxia
* @version 1.0
* @date 2022/11/21 22:17
*/
public class ConcreteProduct2 extends Product{
@Override
public void method2() {
//业务逻辑
}
}
package com.lidaxia.design.pattern.creational.factory;
/**
* @author lidaxia
* @version 1.0
* @date 2022/11/21 22:18
*/
public abstract class Creator {
/**
* 创建一个产品对象,其输入参数类型可以自行设置
* 通常为String Enum Class 等
* @param c
* @param <T>
* @return
*/
public abstract <T extends Product> T createProduct(Class<T> c);
}
package com.lidaxia.design.pattern.creational.factory;
/**
* @author lidaxia
* @version 1.0
* @date 2022/11/21 22:20
*/
public class ConCreteCreator extends Creator {
@Override
public <T extends Product> T createProduct(Class<T> c) {
Product product = null;
try {
product = (Product) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T) product;
}
}
package com.lidaxia.design.pattern.creational.factory;
/**
* @author lidaxia
* @version 1.0
* @date 2022/11/21 22:21
*/
public class Client {
public static void main(String[] args) {
Creator creator = new ConCreteCreator();
Product product = creator.createProduct(ConcreteProduct1.class);
// 继续业务处理
}
}