博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
工厂模式
阅读量:7060 次
发布时间:2019-06-28

本文共 3769 字,大约阅读时间需要 12 分钟。

工厂模式

简单工场模式

>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

你可能感兴趣的文章
sqlserver查询表索引
查看>>
JavaScript 基础知识系列:数据类型及slice(8,-1)
查看>>
String,StringBuffer,StringBuilder三者有什么异同?
查看>>
[LeetCode] Invert Binary Tree
查看>>
uincode常识
查看>>
QT两个字符串转化函数,避免文字乱码。
查看>>
2018.3.31——(4)句子
查看>>
js call
查看>>
限定符
查看>>
You cannot change what you refuse to confront.
查看>>
a 标签 跳转4种类型
查看>>
jenkins+ant+ssh远程部署服务glassfish
查看>>
洛谷—— P2543 [AHOI2004]奇怪的字符串
查看>>
洛谷——P1358 扑克牌
查看>>
MyBatis注意事项
查看>>
WCF配置文件
查看>>
VR系统的组成
查看>>
ECshop新增单页面模板的方法
查看>>
【转载】VMware vSphere 5 HA详解 1
查看>>
【原创】] windows环境下Android环境变量配置(新手专用)
查看>>