工厂模式

Posted chainsmokers

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工厂模式相关的知识,希望对你有一定的参考价值。

??工厂模式主要分为简单工厂模式、工厂方法模式和抽象工厂模式,它主要作用是将对象实例化的部分抽取出来,降低代码的耦合度,其中简单工厂模式不属于23种设计模式。下面将对这三种模式进行介绍。

一、简单工厂模式

1.静态工厂模式

??创建静态工厂方法,传入类型来返回相应实例。下面我们写一个简单工厂类来创建Vehicle实例。创建一个Vechile接口和实现它的三个具体类:Bike、Car、Trunk。静态工厂类代码如下所示:

/**
 * 静态工厂类
 */
public class VehicleFactory {

    public enum VehicleType{
        Bike,
        Car,
        Truck;
    }

    public static Vehicle createVehicle(VehicleType type){
        if(type.equals(VehicleType.Bike)){
            return new Bike();
        }
        if(type.equals(VehicleType.Car)){
            return new Car();
        }
        if(type.equals(VehicleType.Truck)){
            return new Truck();
        }
        
        return null;
    }
}

??工厂类逻辑很简单,只负责创建Vehicle类的实例,符合单一职责原则;用户只调用Vehicle接口,这样可以减少耦合,符合依赖倒置原则;但增加一个新的Vehicle实现类则需要对VehicleFactory进行修改,这样就打破了开闭原则。

??我们可以改进这种模式,使得在注册新的类可以被实例化,从而保证对其扩展开放同时修改闭合。实现的具体方式可以使用反射机制注册产品类对象和实例化。

2.使用反射机制的简单工厂模式

/**
 * 反射机制的简单工厂类
 */
public class VehicleFactory {
    private Map<String, Class> registerProducts = new HashMap<String, Class>();

    public void registerVehicle(String vehicleId, Class vehicleClass){
        registerProducts.put(vehicleId, vehicleClass);
    }

    public Vehicle createVehicle(String vehicleType) throws Exception{
        Class productClass = registerProducts.get(vehicleType);
        return (Vehicle) productClass.newInstance();
    }
}

??但在默写情况下,反射机制并不适用,比如在特定环境中无法实现。反射机制也会降低程序的运行效率,对性能要求很高的情况下应该避免使用这种机制。

二、工厂方法模式

??工厂方法模式是在静态工厂模式上的改进。工厂类需要被抽象化,用于实例化特定产品类的代码被转移到实现抽象方法的子类中。这样无需修改就可以扩展工具类。

工厂方法有4个对象:

  • 抽象工厂类(Factory):提供抽象方法供具体工厂实现
  • 具体工厂类(ConcreteFactory):提供具体的工厂
  • 抽象产品类(Product):提供抽象方法供具体产品类实现
  • 具体产品类(ConcreteProduct):提供具体的产品

抽象工厂类:

/**
 * 汽车工厂
 */
public abstract class VehicleFactory {

    public abstract Vehicle createVehicle();
}

具体工厂类:

public abstract class Vehicle {

    public abstract void product();
}

抽象产品类

/**
 * 自行车工厂
 */
public class BikeFactory extends VehicleFactory {

    @Override
    public Vehicle createVehicle() {
        return new Bike();
    }
}

具体产品类

public class Bike extends Vehicle {

    @Override
    public void product() {
        System.out.println("生产自行车");
    }
}

三、抽象工厂模式

??抽象工厂模式是工厂方法模式的扩展版本。他不再是需要单一类型的对象,而是创建一系列相关联的对象。如果说工厂方法模式只包含一个抽象产品类,那么抽象工厂模式则包含多个抽象产品类。
??工厂方法类只有一个抽象方法,在不同的具体工厂类中分别实现抽象产品的实例化,而在抽象工厂类中,每个抽象产品都有一个实例化方法。

汽车类:

public abstract class Car {
    abstract void drive();
}

宝马产品类:

public abstract class BMWCar extends Car {
}

具体产品BMW320类:

public class BMW320 extends BMWCar {
    public void drive()
    {
        System.out.println("BMW320,运动酷炫。");
    }
}

工厂类:

public class BMWFactory extends AbstractFactory {
    public Car getCar(String type) throws ClassNotFoundException,
            IllegalAccessException, InstantiationException
    {
        Class cl = Class.forName(type);
        return (BMWCar)cl.newInstance();
    }
}

抽象工厂类:

public abstract class AbstractFactory {
    public abstract Car getCar(String type) throws ClassNotFoundException,
            IllegalAccessException, InstantiationException;
}

以上是关于工厂模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式学习——简单工厂模式工厂模式抽象工厂模式

设计模式简单工厂模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

设计模式学习——简单工厂模式工厂模式抽象工厂模式

设计模式工厂方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

设计模式-简单工厂工厂方法模式抽象工厂模式详解

C++工厂模式(简单工厂工厂方法抽象工厂)