工厂设计模式

一.为什么要使用工厂设计模式

1.使用工厂设计模式主要目的是为了解耦,即对象的创建和对象的使用分开来进行,如classA需要使用classB的对象,自己不需要new一个classB的对象,交给工厂即可,符合“单一职责原则”,有利于对功能的复用和系统的维护。

2.防止用来创建和实例化一个类的数据和代码在许多类中都存在,可以将创建该类的代码封装到一个工厂类中去,减少代码冗余,有益于系统优化和维护。

3.工厂管理了类的创建逻辑,使用者不需要知道类的创建逻辑如何,只需要使用即可,减少出错的概率。

二.厂模式的三种类型

1.简单工厂类

package com.yqg.day2;

public class Factory {
      int num;
      public Factory(int num) {
          this.num=num;
      }
      public Product getProduct() {
          switch(num) {
          case 1:
              return new Product1();
              
          case 2:
             return new Product2();
             
          default:
              return null;
          }
      }
}

interface Product{
    void said();
}

class Product1 implements Product{

    @Override
    public void said() {
        System.out.println("产品1");
        
    }
    
}

class Product2 implements Product{

    @Override
    public void said() {
        System.out.println("产品2");
        
    }
    
}

缺点:如果产品类非常多,会给产品维护和扩展带来很多麻烦。而且有新的产品加入就要修改工厂类的代码,违反了开闭原则,扩展开始,修改关闭。

2.工厂模式

interface IFactory //工厂接口
    {
        IProduct GetProduct();
    }
 
    //A工厂类
    public class FactoryA: IFactory
    {
        IProduct productA;
        public FactoryA()
        {
            this.productA = new ProductA();
        }
 
        public IProduct GetProduct() //A工厂生产A产品
        {
            return this.productA;
        }
    }
 
    //B工厂类
    public class FactoryB : IFactory
    {
        IProduct productB;
        public FactoryB()
        {
            this.productB = new ProductB();
        }
 
        public IProduct GetProduct() //B工厂生产B产品
        {
            return this.productB;
        }
    }
 
    //产品接口
    public interface IProduct
    {
        //产品方法
        //......
    }
 
    //产品A
    public class ProductA : IProduct
    {
        //产品属性
        //......
    }
 
    //产品B
    public class ProductB : IProduct
    {
        //产品属性
        //......
    }

观察代码,现在一个工厂负责生产一个产品,如果新增产品C,只需要增加一个工厂C生产产品C,不会对其他产品造成影响,但是工厂模式无法满足产品族和产品等级结构的问题。所以我们用到了下面的抽象工厂。

3.抽象工厂

  //工厂接口,即抽象工厂
        interface IFactory
        {
            IFridge CreateFridge();
            IAirCondition CreateAirCondition();
        }
 
 
        //三星的工厂,生产三星的产品族
        public class SamsungFactory : IFactory
        {
  
            public IAirCondition CreateAirCondition() 
            {
                return new SamsungAirCondition(); //三星的工厂生产三星的空调
              
            }
 
            public IFridge CreateFridge()
            {
                return new SamsungFridge(); //三星的工厂生产三星的冰箱
            }
        }
 
        //格力的工厂,生产格力的产品族
 
        public class GreeFactry : IFactory
        {
            public IAirCondition CreateAirCondition()
            {
                return new GreeAirCondition(); //格力的工厂生产格力的空调
            }
 
            public IFridge CreateFridge()
            {
                return new GreeFridge(); //格力的工厂生产格力的冰箱
            }
        }
 
        //冰箱产品接口
        public interface IFridge
        {
            //冰箱产品接口
            //冰箱的action
        }
 
        //空调接口
        public interface IAirCondition
        {
            //空调产品接口
            //空调的action
        }
 
        //三星的冰箱
        public class SamsungFridge: IFridge
        {
           //三星冰箱的action和property
        }
        //格力的冰箱
        public class GreeFridge : IFridge
        {
             //格力冰箱的action和property
        }
 
        //三星的空调
        public class SamsungAirCondition : IAirCondition
        {
           //三星空调的action和property
        }
        //格力的空调
        public class GreeAirCondition : IAirCondition
        {
            //格力空调的action和property
        }

4.总结

一、三种工厂的实现是越来越复杂的

二、简单工厂通过构造时传入的标识来生产产品,不同产品都在同一个工厂中生产,这种判断会随着产品的增加而增加,给扩展和维护带来麻烦

三、工厂模式无法解决产品族和产品等级结构的问题

四、抽象工厂模式中,一个工厂生产多个产品,它们是一个产品族,不同的产品族的产品派生于不同的抽象产品(或产品接口)。

posted @ 2018-07-14 21:49  执棋手  阅读(177)  评论(0编辑  收藏  举报