java常用设计模式3——工厂方法模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_31093133/article/details/82970356

1、工厂方法模式定义:定义一个用于创建对象的接口,让子类决定实例化哪个类
2、工厂方法模式的使用场景:在任何需要生成复杂对象的地方,都可以使用工厂方法模式。复杂对象适合使用工厂模式,用new就可以完成创建的对象无需使用工厂模式

多工厂方法模式

代码示例:
1、定义一个抽象的产品接口(非必须)

/**
 * 抽象的产品接口
 */
public abstract class Product {
    /**
     * 产品类的抽象方法,由具体的产品类去实现
     */
    public abstract void productName();

}

2、具体的产品实现类

public class ProductA extends Product {
    @Override
    public void productName() {
        Log.i("LHD", "这是A产品");
    }
}
public class ProductB extends Product {
    @Override
    public void productName() {
        Log.i("LHD", "这是B产品");
    }
}

3、抽象工厂类

/**
 * 抽象的工厂接口
 */
public abstract class Factory {
    /**
     * 抽象工厂方法,具体生产什么由子类去实现
     */
    public abstract Product createProduct();
}

4、具体工厂类

/**
 * A产品的工厂
 */
public class FactoryA extends Factory {
    @Override
    public Product createProduct() {
        return new ProductA();
    }
}
/**
 * B产品的工厂
 */
public class FactoryB extends Factory {
    @Override
    public Product createProduct() {
        return new ProductB();
    }
}

使用:

                Factory factory = new FactoryA();
                Product p = factory.createProduct();
                p.productName();

这种方式很常见,每个产品都有自己的工厂方法,他们实现了同样的工厂接口,需要哪个产品就使用哪个工厂,像这种拥有多个工厂的方式称为多工厂方法模式。

简单工厂(静态工厂)模式

当然我们可以有更简洁的方式,我们可以简化成一个工厂,并去掉接口,然后给工厂类传入一个参数,并根据参数来决定生产哪个,代码修改如下:

去掉接口,传入一个类参数,来决定生产哪个产品

/**
 * 使用反射来根据参数创建对象
 */
public class CreateProductFactory {
    public <T extends Product> T createProduct(Class<T> clz) {
        Product p = null;
        try {
            p = (Product) Class.forName(clz.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (T) p;
    }
}

使用:

                CreateProductFactory factory = new CreateProductFactory();//由于去掉了Factory,所以需要实例化具体的工厂对象
                Product p = factory.createProduct(ProductA.class);//传入ProductA.class则生产A产品
                //Product p = factory.createProduct(ProductB.class);//传入ProductA.class则生产B产品
                p.productName();

像这样的只有一个工厂的方式称为简单工厂模式或静态工厂模式,它是工厂方法模式的一个弱化版本。

工厂方法模式是完全符合设计原则的,其降低了对象之间的耦合度,而且,工厂方法模式依赖于抽象的架构,其将实例化的任务交由子类去完成,有非常好的扩展性。

另外还有一个抽象工厂模式,具体没怎么用过,就不做介绍啦。

以上就是工厂方法模式的简单介绍啦(#^ . ^#)

猜你喜欢

转载自blog.csdn.net/baidu_31093133/article/details/82970356
今日推荐