/* All Contributors (C) 2020 */
package cn.edu.jxnu.examples.design;

/**
 * Copyright © 2018 梦境迷离. All rights reserved.
 *
 * @description:定义一个用于创建对象的接口，让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 @Package: cn.jxnu.edu.designpattern
 * @author: 梦境迷离
 * @date: 2018年3月20日 上午9:45:12
 */
/**
 * 简单工厂模式： 一个模块仅需要一个工厂类，没有必要把它产生出来，使用静态的方法 多个工厂类：
 * 每个人种（具体的产品类）都对应了一个创建者，每个创建者独立负责创建对应的产品对象，非常符合单一职责原则
 */
/**
 * 代替单例模式： 单例模式的核心要求就是在内存中只有一个对象，通过工厂方法模式也可以只在内存中生产一个对象 延迟初始化：
 * ProductFactory负责产品类对象的创建工作，并且通过prMap变量产生一个缓存，对需要再次被重用的对象保留 使用场景：jdbc连接数据库，硬件访问，降低对象的产生和销毁
 */
public class FactoryMethod extends Creator {
    // Product为抽象产品类负责定义产品的共性，实现对事物最抽象的定义；
    // Creator为抽象创建类，也就是抽象工厂，具体如何创建产品类是由具体的实现工厂FactoryMethod完成的。
    @SuppressWarnings({"unchecked", "deprecation"})
    public <T extends Product> T createProduct(Class<T> c) {
        Product product = null;
        try {
            product = (Product) Class.forName(c.getName()).newInstance();
        } catch (Exception e) {
            // 异常处理
        }
        return (T) product;
    }
}

class Creator {}

class Product {}
