zoukankan      html  css  js  c++  java
  • 工厂模式

    工厂模式

    简单工场模式

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

  • 相关阅读:
    <转> 解决异常:IllegalStateException: Fragment <ThisFragment> is not currently in the FragmentManager
    带你走进Android Afinal框架的世界
    Android滑动菜单特效实现,仿人人客户端侧滑效果,史上最简单的侧滑实现
    Myeclipse启动不了的解决方法
    select 禁止 选择
    jquery的clone方法应用于textarea和select的bug修复不能copy值,clone id重复的解决
    玩javaweb的web.xml编译路径
    程序员笔记之设计(一)
    Eclipse清除SVN密码
    Java 最简单的批处理
  • 原文地址:https://www.cnblogs.com/zddsblog/p/7467336.html
Copyright © 2011-2022 走看看