应用最广泛的模式——工厂方法模式

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

背景

工厂方法是创建型设计模式之一,工厂方法模式是一种结构简单的模式,在我们的开发之中应用十分广泛,作为一个java程序员,我们实在有必要去深入理解

一、工厂方法模式定义

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

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

二、普通工厂方法模式

public abstract class Product {
/**
 * 产品类的抽象方法
 * 由具体产品类去实现
 */
    public abstract void mothod();
}
public class ConcreteProductA extends Product{

    @Override
    public void mothod() {
        // TODO 自动生成的方法存根
        System.out.println("我是具体产品A");
    }
}

public class ConcreteProductB extends Product{

    @Override
    public void mothod() {
        // TODO 自动生成的方法存根
        System.out.println("我是具体产品B");
    }


}
public abstract class Factory {

    /**
     * 抽象工厂方法 具体产品让子类去实现
     */
    public abstract Product createProduct();
}
public class ConcreteProductA extends Product{

    @Override
    public void mothod() {
        // TODO 自动生成的方法存根
        System.out.println("我是具体产品A");
    }
}
public class Client {
public static void main(String[] args) {
    ConcreteFactory concreteFactory = new ConcreteFactory();
    Product p = concreteFactory.createProduct();
    p.mothod();
}
}

这里的几个角色很简单,主要分为四大模块,一是抽象工厂,其为工厂方法模式的核心,二是具体工厂,其实现了具体的业务逻辑,三是抽象产品,是工厂方法模式所创建的产品的父类,四是具体产品,为实现抽象产品的某个具体产品对象。

上诉的代码中我们在Client类中构建了一个工厂对象,并通过其生产了一个产品对象,这里我们得到的产品对象是ConcreateProdcutA的实例,如果想得到ConcreateProdcutB的实例,更改ConcreteFactory中的逻辑即可。

三、反射调用工厂模式

除了上述的方式使用工厂模式,比较常用的还有通过反射来会更加简洁来生产具体产品对象,此时,需要在工厂方法中传入一个方法的参数class类来决定是生产哪一个产品类

public abstract class Factory2 {

    public abstract <T extends Product> T createProduct(Class<T> clz);
}
public class ConcreteFactory2  extends Factory2{
    @Override
    public <T extends Product> T createProduct(Class<T> clz) {
        // TODO 自动生成的方法存根
        Product product=null;
         try {
            product = (Product) Class.forName(clz.getName()).newInstance();
        } catch (InstantiationException | IllegalAccessException
                | ClassNotFoundException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
        return (T)product;
    }
}

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

四、静态工厂模式

public class StaticFactory {
    public  static Product  createProduct(){
        return new ConcreteProductA();
    }

}

像这种方法我们称为简单工厂或者静态工厂方法模式,它是工厂方法模式的一种弱化版本,可以很方便地去调用它。

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

五、总结

总的来说,工厂方法模式是一个很好的设计模式,在本文多处用到有对其优点进行总结,但是缺点也是有的,每次我们为工厂方式添加新的产品时就要编写一个新的产品类,同时还要引入抽象层,这必然导致结构的复杂化,所以在某些情况下是否使用工厂模式,需要设计者权衡利弊了。

猜你喜欢

转载自blog.csdn.net/a820703048/article/details/79134454