跳至主要內容

设计模式-创建型-工厂方法

引领潮流小于 1 分钟设计模式archive

1、定义

工厂方法:定义一个用于创建对象的接口,让子类决定实例化那个类

2、例子

1、写法一

产品

public interface Product {
    void method();
}

public class ProductA implements Product{
    @Override
    public void method() {

    }
}

public class ProductB implements Product{
    @Override
    public void method() {
        
    }
}
/**
 * 工厂
 */
public interface Factory {
    Product createProduct();
}

public class FactoryA implements Factory{
    @Override
    public Product createProduct() {
        return new ProductA();
    }
}

public class FactoryB implements Factory{
    @Override
    public Product createProduct() {
        return new ProductB();
    }
}

客户端调用

/**
 * 让子类决定实例化那个类
 * 工厂方法
 */
public class TestMain {

    public static void main(String[] args) {
        Factory factory = new FactoryA();
        Product product = factory.createProduct();
        product.method();
    }

}
2、方法二 用反射
public interface Product {
    void method();
}

public class ProductA implements Product {
    @Override
    public void method() {

    }
}

/**
 * 工厂
 */
public interface Factory {
    <T extends Product> T createProduct(Class<T> clazz);
}

public class ConcreteFactory implements Factory{
    @Override
    public <T extends Product> T createProduct(Class<T> clazz) {
        Product product = null;
        try {
            product = (Product) Class.forName( clazz.getName() ).newInstance();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return (T)product;
    }
}

/**
 * 让子类决定实例化那个类
 * 工厂方法
 */
public class TestMain {

    public static void main(String[] args) {
        Factory factory = new ConcreteFactory();
        Product product = factory.createProduct( ProductA.class );
        product.method();
    }

}

3、代码示例

https://github.com/yinlingchaoliu/23-design-pattern