Android设计模式

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

2017-12-28  本文已影响6人  忘尘无憾

定义

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

关键点

工厂方法UML图

使用场景

场景例子说明

public abstract class Product {
    /**
     * 抽象产品类的抽象方法
     * <br/>
     * 由具体的产品类去实现
     */
    public abstract void showProduct();
}
// 具体产品类A
public class ProductA extends Product {
    @Override
    public void showProduct() {
        System.out.println("我是具体的产品类A");
    }
}

// 具体产品类B
public class ProductB extends Product {
    @Override
    public void showProduct() {
        System.out.println("我是具体的产品类B");
    }
}
public abstract class Factory {
    /**
     * 抽象工厂方法
     * <br/>
     * 具体生产什么交给子类去做
     * @return
     */
    public abstract Product createProduct();
}
public class JFactory extends Factory {
    @Override
    public Product createProduct() {
        return new ProductA();
    }
}
public class FactoryTest {
    public static void main(String[] args) {
        Factory factory = new JFactory();
        Product product = factory.createProduct();
        product.showProduct();
    }
}

//结果
我是具体的产品类A

若是想生产产品类B,则可以将具体工厂类修改如下:

public class JFactory extends Factory {
    @Override
    public Product createProduct() {
        return new ProductB();
    }
}

// 结果
我是具体的产品类B
通过反射的方式

在我们具体的工厂中,想要生产那个具体的产品就可以生成具体的产品,但是每次都需要修改具体工厂的内容。如果采用反射的方式,则可以更为简洁地来生产具体产品。

只需要在工厂方法中的参数列表传入一个Class类来决定是哪一个产品类即可。

// 抽象工厂类
public abstract class FS_Factory {
    /**
     * 抽象工厂方法
     * <br/>
     * 具体生产什么由子类去实现
     * @param clz 产品对象类型
     * @param <T> 
     * @return
     */
    public abstract <T extends Product> T createPruduct(Class<T> clz);
}

// 具体工厂类
public class FS_JFactory extends FS_Factory {

    @Override
    public <T extends Product> T createPruduct(Class<T> clz) {
        Product product = null;
        try {
            product = (Product) Class.forName(clz.getName()).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return (T) product;
    }

// 测试
public class FactoryTest {
    public static void main(String[] args) {
        FS_Factory fs_factory = new FS_JFactory();
        Product product1 = fs_factory.createPruduct(ProductB.class);
        product1.showProduct();

    }
}
// 结果
我是具体的产品类B

从上可以知道,通过反射可以需要哪个对象就传入哪个对象的类型即可,这种方式比较简洁、动态。

多工厂方法模式

如果觉得上述反射的方式比较复杂,不易理解,也可以尝试为每个产品单独定义具体的工厂,各司其职。这种方法被称为多工厂方法模式。

public class JFactoryA extends Factory {
    @Override
    public Product createProduct() {
        return new ProductA();
    }
}
public class JFactoryB extends Factory {
    @Override
    public Product createProduct() {
        return new ProductB();
    }
}
简单工厂模式(静态工厂模式)

假设当我们只有一个工厂,那么其实无需抽象工厂类,可以将其简化。同时将简化的工厂里的工厂方法改为静态方法即可。这种方式则被称为简单工厂模式,实际上是工厂方法模式的弱化版本。

// 简单工厂类
public class JD_Factory {
    public static Product createProduct() {
        return new ProductA();
    }
}

// 测试
public class FactoryTest {
    public static void main(String[] args) {
        Product product2 = JD_Factory.createProduct();
        product2.showProduct();

    }
}

// 结果
我是具体的产品类A

工厂方法的优缺点

优点

缺点

引用
《Android源码设计模式解析与实战》
Android设计模式(四)- 工厂方法模式
[Android]三种工厂模式总结。

上一篇 下一篇

猜你喜欢

热点阅读