Factory

作者: 93张先生 | 来源:发表于2020-09-24 09:35 被阅读0次

    工厂模式

    复杂对象的创建适合采用工厂模式,确保创造对象的步骤是集中的不是分散在各个类中的。

    工厂模式和抽象工厂模式

    工厂模式是采用最简单的方法,一个工厂创建相似的不同的产品。
    抽象工厂模式是存在另一个维度抽象,即工厂维度的抽象,存在多个不同工厂的实现类,然后不同的工厂创建不同的相似的产品。

    特征

    • 创建复杂对象
    • 创建对象的过程集中在一起
    • 暴露一个对外创建对象的方法
    • 类与类之间的解耦,不需要 new Object(),而是采用工厂类创建对象

    用例

    一个车工厂,创建 3 中不同类型的车,small、sedan(轿车)、luxury(豪车)

    CarType

    CarType 枚举类,持有三种不同的车的类型

    public enum CarType {
        SMALL, SEDAN, LUXURY
    }
    

    Car

    Car 是一个具体车型的抽象类,定义了车的公共逻辑和车的类型。

    public abstract class Car {
     
        public Car(CarType model) {
            this.model = model;
            arrangeParts();
        }
     
        private void arrangeParts() {
            // Do one time processing here
        }
     
        // Do subclass level processing in this method
        protected abstract void construct();
     
        private CarType model = null;
     
        public CarType getModel() {
            return model;
        }
     
        public void setModel(CarType model) {
            this.model = model;
        }
    }
    

    LuxuryCar

    LuxuryCar 豪车

    public class LuxuryCar extends Car {
     
        LuxuryCar() {
            super(CarType.LUXURY);
            construct();
        }
     
        @Override
        protected void construct() {
            System.out.println("Building luxury car");
            // add accessories
        }
    }
    

    SmallCar

    小型车

    public class SmallCar extends Car {
     
        SmallCar() {
            super(CarType.SMALL);
            construct();
        }
     
        @Override
        protected void construct() {
            System.out.println("Building small car");
            // add accessories
        }
    }
    

    SedanCar

    轿车

    public class SedanCar extends Car {
     
        SedanCar() {
            super(CarType.SEDAN);
            construct();
        }
     
        @Override
        protected void construct() {
            System.out.println("Building sedan car");
            // add accessories
        }
    }
    

    CarFactory

    创建 Car 的工厂类

    public class CarFactory {
        public static Car buildCar(CarType model) {
            Car car = null;
            switch (model) {
            case SMALL:
                car = new SmallCar();
                break;
     
            case SEDAN:
                car = new SedanCar();
                break;
     
            case LUXURY:
                car = new LuxuryCar();
                break;
     
            default:
                // throw some exception
                break;
            }
            return car;
        }
    }
    

    Test

    调用实例

    public class TestFactoryPattern {
        public static void main(String[] args) {
            System.out.println(CarFactory.buildCar(CarType.SMALL));
            System.out.println(CarFactory.buildCar(CarType.SEDAN));
            System.out.println(CarFactory.buildCar(CarType.LUXURY));
        }
    }
    

    常见示例

    • java.sql.DriverManager.getConnection()

    抽象工厂模式

    在工厂模式中,对工厂维度进行了抽象,就是抽象工厂模式,适用于多个不同的工厂,不同的工厂创建不同的系列产品。

    特征

    • 在工厂模式中
    • 对工厂维度的抽象
    • 不同的工厂,创建出不同的系列产品

    实例

    为了支持汽车的全球化业务,满足不同地区的对不同汽车风格需求,比如方向盘在左边,还是在右边,从而出现了工厂抽象,存在不同位置的工厂,比如 美国工厂、亚洲工厂、默认本地工厂,从而出现了工厂维度的抽象。

    Car

    满足不同地区,不同车型,从而车有了产地这个维度。

    public abstract class Car {
     
      public Car(CarType model, Location location){
        this.model = model;
        this.location = location;
      }
     
      protected abstract void construct();
     
      private CarType model = null;
      private Location location = null;
     
      //getters and setters
     
      @Override
      public String toString() {
        return "Model- "+model + " built in "+location;
      }
    }
    

    Location

    车的产地

    public enum Location {
      DEFAULT, USA, ASIA
    }
    

    LuxuryCar

    豪车

    public class LuxuryCar extends Car
    {
      public LuxuryCar(Location location)
      {
        super(CarType.LUXURY, location);
        construct();
      }
     
      @Override
      protected void construct() {
        System.out.println("Building luxury car");
        //add accessories
      }
    }
    

    AsiaCarFactory

    亚洲车工厂

    public class AsiaCarFactory
    {
      public static Car buildCar(CarType model)
      {
        Car car = null;
        switch (model)
        {
          case SMALL:
          car = new SmallCar(Location.ASIA);
          break;
     
          case SEDAN:
          car = new SedanCar(Location.ASIA);
          break;
     
          case LUXURY:
          car = new LuxuryCar(Location.ASIA);
          break;
     
          default:
          //throw some exception
          break;
        }
        return car;
      }
    }
    

    DefaultCarFactory

    默认本地车工厂

    public class DefaultCarFactory
    {
      public static Car buildCar(CarType model)
      {
        Car car = null;
        switch (model)
        {
          case SMALL:
          car = new SmallCar(Location.DEFAULT);
          break;
     
          case SEDAN:
          car = new SedanCar(Location.DEFAULT);
          break;
     
          case LUXURY:
          car = new LuxuryCar(Location.DEFAULT);
          break;
     
          default:
          //throw some exception
          break;
        }
        return car;
      }
    }
    

    USACarFactory

    美国车工厂

    public class USACarFactory
    {
      public static Car buildCar(CarType model)
      {
        Car car = null;
        switch (model)
        {
          case SMALL:
          car = new SmallCar(Location.USA);
          break;
     
          case SEDAN:
          car = new SedanCar(Location.USA);
          break;
     
          case LUXURY:
          car = new LuxuryCar(Location.USA);
          break;
     
          default:
          //throw some exception
          break;
        }
      return car;
      }
    }
    

    CarFactory

    已经有了三种不同的车工厂,现在抽象出有哪个工厂去创建车

    public class CarFactory
    {
      private CarFactory() {
        //Prevent instantiation
      }
     
      public static Car buildCar(CarType type)
      {
        Car car = null;
        Location location = Location.ASIA; //Read location property somewhere from configuration
        //Use location specific car factory
        switch(location)
        {
          case USA:
            car = USACarFactory.buildCar(type);
            break;
          case ASIA:
            car = AsiaCarFactory.buildCar(type);
            break;
          default:
            car = DefaultCarFactory.buildCar(type);
        }
      return car;
      }
    }
    

    TestFactoryPattern

    public class TestFactoryPattern
    {
      public static void main(String[] args)
      {
        System.out.println(CarFactory.buildCar(CarType.SMALL));
        System.out.println(CarFactory.buildCar(CarType.SEDAN));
        System.out.println(CarFactory.buildCar(CarType.LUXURY));
      }
    }
    

    场景

    • MyBatis 中连接池和非连接池数据源,存在连接池工厂创建连接池数据源,非连接池工厂创建非连接池数据源。

    相关文章

      网友评论

        本文标题:Factory

        本文链接:https://www.haomeiwen.com/subject/uavqyktx.html