工厂模式

工厂模式

简单工场模式

>int prodNo;
        public SimpleFactory(int prodNo) //构造工厂时告知工厂产品标识
        {
            this.prodNo = prodNo;
        }

        public IProduct GetProduct()
        {
            switch (prodNo) //根据产品标识生产产品
            {
                default:
                    return new ProductA();
                case 1:
                    return new ProductA();
                case 2:
                    return new ProductB();
            }

         }


    }

    //产品A
    class ProductA: IProduct 
    {
        //产品属性
        //......
    }

    //产品B
    class ProductB : IProduct
    {
        //产品属性
        //......
    }
    //产品接口
    interface IProduct
    {
        //产品方法
        //......
    }

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

工场模式

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
    {
        //产品属性
        //......
    }

这里已经将工厂类分开,不再将所有产品在同一工场中生产,这样就解决了简单工场中不停的switch case的问题,如果说来了一个C产品,那么我们只需要写一个C工厂和C产品,在调用C工厂生产C产品即可,工场模式无法解决产品族和产品等级结构的问题
何谓产品族和产品等级结构。举个例子来说,比如三星是一个品牌,三星生产洗衣机,电视,冰箱;格力也是一个品牌,格力也生产洗衣机,电视,冰箱。那么,三星工厂和格力工厂生产的2个品牌的洗衣机,就在洗衣机这种产品的产品等级结构中(当然洗衣机产品等级结构中还有LG,海尔,三菱等等不同的品牌的工厂的产品),所以,洗衣机就是一个产品等级。那么三星生产的三星洗衣机,三星电视机,三星冰箱就是三星这个工厂的产品族。可能还会有西门子工厂产品族,格力工厂产品族,美的工厂产品族等等。

抽象工厂模式

 //工厂接口,即抽象工厂
        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个结论:工厂模式中,一个工厂生产一个产品,所有产品派生于同一个产品抽象(产品接口);而抽象工厂模式中,一个工厂生产多个产品,他们是一个产品族,不同的产品族派生于不同的抽象产品(产品接口)

原文地址:https://www.cnblogs.com/zddsblog/p/7467336.html