谈谈几种工厂模式

简单工厂模式

假设我们有一个造车厂,可以制造各种车。

  • Car接口
public interface Car{//通用的产品接口
    void show();
}
  • 具体的car车类型

    public class QQCar implements Car{
        public void show(){
            System.out.println("QQ系列Car");
        }
    }
    
    public class BYDCar implements Car{
        public void show(){
            System.out.println("BYD系列Car");
        }
    }
    
    • factory简单工厂

      public class CarFactory{//示例代码,非实际开发
          public Car createCar(String type){
              if (/*获取创造具体产品类型*/.equals("QQ")) {
                 return new QQCar();
              } else if (/*获取创造具体产品类型*/.equals("BYD")) {
                 return new BYDCar();
              }
              return null;
          }
      }
      

工厂方法模式

由父类提供一个创建对象的方法,允许子类决定实例化对象的类型,换言之就是让类的实例化推迟到子类去完成

  • 工厂(基础创建者)
public abstract class CreateCarFactory{//选用抽象类或者接口视情况而定
    public abstract Car createCar();
    
    .....//other code
}
  • 具体工厂(具体创建者)

    public class QQCarFactory extends CreateCarFactory{
        @Override
        public Car createCar() {
            return new QQCar();
        }
    }
    
    public class BYDCarFactory extends CreateCarFactory{
        @Override
        public Car createCar() {
            return new BYDCar();
        }
    }
    
  • 执行代码

    public class Demo {
        private static CreateCarFactory carfactory;
        //示例代码,非实际开发
        static void selectFactory() {
            if (/*获取创造具体产品类型*/.equals("QQ")) {
               carfactory = new QQCarFactory();
            } else if (/*获取创造具体产品类型*/.equals("BYD")) {
               carfactory = new BYDCarFactory();
            } 
        }
    }
    

    优点:

    • 避免客户端代码与具体产品代码出现耦合
    • 符合单一职责原则、开闭原则,使得代码易维护,易扩展

    缺点:

    • 代码结构变得更复杂

抽象工厂模式

用于提供一个创建一系列相关或互相依赖对象的接口,产品族系多于一个。

即直接在抽象的接口增加方法。

如在车厂还可以生成车载电脑,QQ生产使用qq系统PC,BYD生产使用byd系统pc

  • PC接口

    public interface PC {
        void show();
    }
    
    public class QQPc implements PC{
        public void show(){
            System.out.println("qq系统PC");
        }
    }
    
    public class BYDPc implements PC{
        public void show(){
            System.out.println("byd系统PC");
        }
    }
    
  • 工厂

    public abstract class CreateCarFactory{//选用抽象类或者接口视情况而定
        public abstract Car createCar();
        public abstract PC createPC();
        .....//other code
    }
    
    • 具体工厂(BYD工厂)
    public class BYDCarFactory extends CreateCarFactory{
        @Override
        public Car createCar() {
            return new BYDCar();
        }
        @Override
        public PC createPC() {
            return new BYDPc();
        }
    }
    
    • 执行代码
    public class Demo {
        private static CreateCarFactory carfactory;
        //示例代码,非实际开发
        static void selectFactory() {
            if (/*获取创造具体产品类型*/.equals("QQ")) {
               carfactory = new QQCarFactory();
            } else if (/*获取创造具体产品类型*/.equals("BYD")) {
               carfactory = new BYDCarFactory();
            } 
        }
    }
    

    优点:

    • 确保了同一工厂生产的产品相互匹配
    • 同 -- 工厂方法具备的优点。

    缺点:同 -- 工厂方法具备的缺点


posted @ 2020-07-17 15:35  Faink  阅读(247)  评论(0)    收藏  举报