工厂模式

Posted beanbag

tags:

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

简单工厂模式

简单工厂模式用于实现逻辑的简单封装,并通过公共的方法提供对象的实例化服务,在添加新的类时,只需要做少量的修改。

代码演示

车辆(抽象类)

/**
 * 车辆(抽象类)
 */
public abstract class Vehicle {
    abstract public void run();
}

小汽车具体类

/**
 * 小汽车具体类
 */
public class Car extends Vehicle {
    @Override
    public void run() {
        System.out.println("小汽车在公路上呼啸而过");
    }
}

自行车具体类

/**
 * 自行车具体类
 */
public class Bike extends Vehicle {
    @Override
    public void run() {
        System.out.println("自行车跑的慢");
    }
}

车辆类型枚举

public enum VehicleType {
    Bike,Car
}

车辆工厂类

/**
 * 车辆工厂类
 */
public class VehicleFactory {
    
    /**
     * 静态工厂模式
     *
     * 工厂只负责Vehicle类的实例化,符合单一职责原则。
     * 用户只调用Vehicle接口,减少耦合,符合依赖倒置原则。
     * @param type
     * @return
     */
    public static Vehicle create(VehicleType type){

        if (type.equals(VehicleType.Bike)){
            return new Bike();
        }
        if (type.equals(VehicleType.Car)){
            return new Car();
        }
        else return null;
    }
}

客户端

public class Client {
    public static void main(String[] args) throws Exception {

        Vehicle bike = VehicleFactory.create(VehicleType.Bike);
        bike.run();//自行车跑的慢

        Vehicle car = VehicleFactory.create(VehicleType.Car);
        car.run();//小汽车在公路上呼啸而过
    }
}

工厂类逻辑简单,只负责Vehicle类的实例化,符合单一职责原则;

用户只调用Vehicle接口,减少耦合,符合依赖倒置的原则;

但是当增加一种新类的时候,需要对VehicleFactory工厂类进行修改,这样就打破了开闭原

则。解决这个问题可以在每个产品类中添加newInstance()方法来解决,该方法返回与自身

类型相同的新实例。

工厂方法模式

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

代码演示

车辆(抽象类)

/**
 * 车辆(抽象类)
 */
public abstract class Vehicle {

    /**
     * 车辆运行
     */
    public abstract void running();
}

汽车类

/**
 * 汽车类
 */
public class Car extends Vehicle {

    @Override
    public void running() {
        System.out.println("小汽车开始运行");
    }
}

卡车类

/**
 * 卡车类
 */
public class Truck extends Vehicle {
    @Override
    public void running() {
        System.out.println("卡车开始运行");
    }
}

车辆抽象工厂

/**
 * 车辆抽象工厂
 */
public abstract class VehicleFactory {
    /**
     * 创建车辆
     * @return
     */
    protected abstract Vehicle createVehicle();

}

汽车具体工厂类

/**
 * 汽车具体工厂类
 */
public class CarFactory extends VehicleFactory {

    @Override
    protected Vehicle createVehicle() {
        return new Car();
    }


}

卡车工厂类

/**
 * 卡车工厂类
 */
public class TruckFactory extends VehicleFactory {
    @Override
    protected Vehicle createVehicle() {
        return new Truck();
    }
}

客户端测试

public class Client {
    public static void main(String[] args) {

        VehicleFactory carFactory = new CarFactory();
        Vehicle car = carFactory.createVehicle();
        car.running();

        VehicleFactory truckFactory = new TruckFactory();
        Vehicle truck = truckFactory.createVehicle();
        truck.running();
    }
}

抽象工厂模式

抽象工厂模式是简单工厂模式的扩展版本。

它不再是创建单一类型的对象,而是创建一系列相关的对象。

如果说工厂方法中只包含一个抽象产品类,那么抽象工厂模式中则包含多个抽象产品类。

车辆抽象类

/**
 * 车辆抽象类
 */
public abstract class Vehicle {
    String color;
    //abstract Vehicle class
    public void testVehicle() {
        // implementation here
    }

    public void setColor(String color) {
        this.color=color;
    }

    public abstract void running();
}

汽车抽象类

/**
 * 汽车抽象类
 */
public abstract class Car extends Vehicle {
}

小轿车具体类

/**
 * 小轿车具体类
 */
public class SedanCar extends Car {
    @Override
    public void running() {
        System.out.println("小轿车开始跑");
    }
}

跑车具体类

/**
 * 跑车具体类
 */
public class SportCar extends Car {
    @Override
    public void running() {
        System.out.println("跑车开始飞驰");
    }
}

卡车抽象类

/**
 * 卡车抽象类
 */
public abstract class Truck extends Vehicle {
}

小卡车具体类

/**
 * 小卡车具体类
 */
public class SmallTruck extends Truck {
    @Override
    public void running() {
        System.out.println("小卡车慢慢的跑");
    }
}

大卡车具体类

/**
 * 大卡车具体类
 */
public class LargeTruck extends Truck {
    @Override
    public void running() {
        System.out.println("大卡车平稳的跑");
    }
}

抽象工厂类

/**
 * 抽象工厂类
 */
public abstract class VehicleFactory {
    protected abstract Vehicle createVehicle(String item);

    public Vehicle orderVehicle(String size, String color)
    {
        Vehicle vehicle = createVehicle(size);

        vehicle.testVehicle();
        vehicle.setColor(color);

        return vehicle;
    }
}

汽车工厂

/**
 * 汽车工厂
 */
public class CarFactory extends VehicleFactory {
    @Override
    protected Vehicle createVehicle(String size) {

        if (size.equals("small"))
            return new SportCar();
        else if (size.equals("large"))
            return new SedanCar();

        return null;
    }
}

卡车工厂

/**
 * 卡车工厂
 */
public class TruckFactory extends VehicleFactory {
    @Override
    protected Vehicle createVehicle(String size) {

        if (size.equals("small"))
            return new SmallTruck();
        else if (size.equals("large"))
            return new LargeTruck();

        return null;
    }
}

客户端测试

public class Client {
    public static void main (String s[]) {
        VehicleFactory carFactory = new CarFactory();
        Vehicle car = carFactory.orderVehicle("small", "blue");
        System.out.println("car.color:" + car.color);
        car.running();

        VehicleFactory truckFactory = new TruckFactory();
        Vehicle truck = truckFactory.orderVehicle("large", "yellow");
        System.out.println("truck.color:" + truck.color);
        truck.running();
    }
}

 

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

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

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

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

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

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

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