工厂方法模式

2019-05-29  本文已影响0人  枫狂的孩子

1.工厂方法模式介绍

工厂方法模式是一种结构简单的模式,其在我们平时开发中应用很广泛,也许你并不知道,但是你已经使用了无数次该模式了,如activity里的各个生命周期方法,以onCreate为例,他就可以看作是一个工厂方法,我们在其中可以构造我们的view,并通过setContentView()返回给framework处理等。

2.工厂方法模式的定义

定义一个用于创建对象的接口,让子类决定实例化那个类。

3.工厂方法模式的使用场景

在任何需要生成复杂对象的地方,都可以使用工厂方法模式,复杂对象适合使用工厂模式,用new就可以完成创建的对象无需使用工厂模式。

4.工厂模式的简单用例

public abstract class Product {

    /**
     * 产品类的抽象方法
     * 有具体的产品类去实现
     */
    public abstract void method();
}
public class ConcreateProductA extends Product {
    @Override
    public void method() {
        System.out.print("我是具体产品A");
    }
}
public class ConcreateProductB extends Product {
    @Override
    public void method() {
        System.out.print("我是具体产品B");
    }
}

public abstract class Factory {
    /**
     * 抽象工厂类
     * 具体产生什么由子类去实现
     * @return
     */
    public abstract Product createProduct();
}
public class ConcreteFactory extends Factory {
    @Override
    public Product createProduct() {
        return new ConcreateProductA();
    }
}
public class Client {
    public static void main(String[] agrs) {
        Factory factory = new ConcreteFactory();
        Product product = factory.createProduct();
        product.method();
    }
}

四大模块:

抽象工厂:工厂方法模式的核心;

具体工厂:实现具体的业务逻辑;

抽象产品:工厂方法模式创建的产品的父类;

具体产品:实现抽象产品的某个具体产品的对象;

这种方法比较常见,需要哪一个产品就生产那个,有时候也可以利用反射方式更简洁的来生成具体产品对象,此时,需要在工厂方法的参数列表中传入一个class类来决定是哪一个产品类。

public abstract class Factory1 {
    /**
     * 抽象工厂类
     * 具体产生什么由子类去实现
     *
     * @return
     */
    public abstract <V extends Product> V createProduct(Class<V> clz);
}
public class ConcreteFactory1 extends Factory1 {
    @Override
    public <T extends Product> T createProduct(Class<T> clz) {
        Product p = null;
        try {
            p = (Product) Class.forName(clz.getName()).newInstance();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return (T) p;
    }
}

再来看看具体的Client中的实现

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

        Factory1 factory1 = new ConcreteFactory1();
        Product product1 = factory1.createProduct(ConcreateProductA.class);
        product1.method();
    }
}

需要哪一个类的对象就传入哪一个类的对象,这种方法比较简洁,动态,如果你不喜欢这种方式,以恶可以尝试每一个产品定义一个具体的工厂,各司其职。

像这样拥有多个工厂的方式我们称为工厂方法模式。它降低了对象之间的耦合度,而且,工厂方法模式依赖于抽象的架构,其将实例化的任务交由子类去完成,有非常好的扩展性。

上一篇下一篇

猜你喜欢

热点阅读