简单工厂模式

来源:互联网 发布:手机修改mac地址 编辑:程序博客网 时间:2024/06/06 22:11

简单工厂模式介绍

简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,说它是一种编程习惯可能更恰当些。因为它至少不是Gof23种设计模式之一。但它在实际的编程中经常被用到,而且思想也非常简单,可以说是工厂方法模式的一个引导。

简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。


例如某个人生病了,去医院看病医生给你开药 ,医生告诉你每天吃什么药,一次吃几片。而不需要告诉你药的制作流程和具体的成分。(医生)

病人只需要按照医生给拿的药每天按时复用即可,病人不需要了解药品的制作流程(病人)

药厂只需要保质保量的生产药品即可。药厂和病人并没有直接的关系(药厂)


举个计算器的例子

没有使用简单工厂模式

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 简单工厂模式的测试{    class Program    {        static void Main(string[] args)        {            Console.Write("请输入数字A");            string A = Console.ReadLine();            Console.Write("请选择运算符号(+、-、*、/):");            string B = Console.ReadLine();             Console.Write("请输入数字B");            string C = Console.ReadLine();            string D = "";            if (B == "+")                D = Convert.ToString(Convert.ToDouble(A) + Convert.ToDouble(C));            if (B == "-")                D = Convert.ToString(Convert.ToDouble(A) - Convert.ToDouble(C));            if (B == "*")                D = Convert.ToString(Convert.ToDouble(A) * Convert.ToDouble(C));            if (B == "/")                D = Convert.ToString(Convert.ToDouble(A) / Convert.ToDouble(C));            Console.WriteLine("结果是:" + D);        }    }}
代码中暴露的问题很多:命名不规范、if 判断出如果这样写的话,意味着每个条件都需要判断。而且只要增加计算器的功能,那么就需要改动整体的代码。

使用简单工厂模式

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 简单工厂模式{    class Program    {        static void Main(string[] args)        {                       //此处为客户端出的代码            Operation oper;             oper = OperationFactory.createOperate("-");  //运算符号            oper.NumberA = 8;   //假设的NumberA为8            oper.NumberB = 2;   //假设的NumberB为2            double result = oper.GetResult();            Console.WriteLine("结果是{0}",result );            Console.ReadKey();                    }        public class Operation        {            private double _numberA = 0;            private double _numberB = 0;            public double NumberA            {                get { return _numberA; }                set { _numberA = value; }            }            public double NumberB            {                get { return _numberB; }                set { _numberB = value; }            }            public virtual double GetResult()            {                double result = 0;                return result ;            }        }//运算类        class OperationAdd : Operation        {            public override double GetResult()            {                double result = 0;                result = NumberA + NumberB;                return result;            }        }//加法类,继承运算类        class OperationSub : Operation        {            public override double GetResult()            {                double result = 0;                result = NumberA - NumberB;                return result  ;                            }        }//减法类,继承运算类        class OperationMul : Operation        {            public override double GetResult()            {                double result = 0;                result = NumberA * NumberB;                return result;                            }        }//乘法类,继承运算类        class OperationDiv : Operation        {            public override double GetResult()            {                double result = 0;                if (NumberB == 0)                    throw new Exception("除数不能为0");                result = NumberA / NumberB;                return result;                                            }        }//除法类,继承运算类        public class OperationFactory        {            public static Operation createOperate(string operate)            {                Operation oper = null;                switch (operate)                {                    case "+":                        oper = new OperationAdd();                        break;                    case"-":                        oper = new OperationSub();                        break;                    case "*":                        oper = new OperationMul();                        break;                    case "/":                        oper = new OperationDiv();                        break;                }                return oper;            }        }//简单运算工厂类(核心类)    }}

如果需要修改界面,那么就只需要去改界面,而不需要去改动运算。如果需要添加各种复杂的运算那么只需要增加运算的子类,而不需要在去改动其他代码。

类的结构图


简单工厂的优缺点

优点:

简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。通过它,外界可以从直接创建具体产品对 象的尴尬局面中摆脱出来。 
外界与具体类隔离开来,偶合性低。 明确区分了各自的职责和权力,有利于整个软件体系结构的优化。 

缺点:
工厂类集中了所有实例的创建逻辑,容易违反GRASPR的高内聚的责任分配原则 
虽然简单工厂模式能够适应一定的变化,但是它所能解决的问题是远远有限的。它所能创建的类只能是事先教考虑到的,如果需要添加新的类,则就需要改变工厂类了。(这个问题在下一个工厂方法模式将得到很好的解决)


1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 补脾益肠丸不适合什么人吃 龙胆泄肝丸不适用那些人 什么人不能吃五子洐宗丸 大活络丸哪些人不能吃 骨化三醇胶丸适合适合什么人 什么人不宜吃麝香保心丸 天王补心丸不适合什么人吃 人参保肺丸 香砂养胃丸不适合什么人吃 香砂六君子丸不适合哪些人 补脾益肠丸适合什么人吃 藿香正气丸什么人不能吃 安神补心丸适合哪些人吃 什么人不适合吃柏子养心丸 木香顺气丸不适合哪些人吃 泰国蜈蚣丸哪些人禁用 小活络丸哪些人不能用 2陈丸哪种人不能吃 大补阴丸适合什么人吃 黑芝麻丸不适合什么人吃 清心丸适合什么人吃 安宫丸什么人不能吃 兰丸多人上受 舒肝健胃丸不适合什么人吃 丹栀逍遥丸适合哪些人 人丹 什么人不适合吃红毛丹 哪些人不适合吃香丹清 丹叁粉哪种人不能吃 丹栀逍遥丸什么人不能吃 百消丹不适用于什么人 哪些人不能吃摩罗丹 环阳丹医生江涛是何许人 丹人修仙之仙界篇 全家人的丹尼斯供应商 全家人的丹尼斯大卖场供应商 艳鼎丹仙 那时那人 什么人不能吃天王补心丹 大活络丹不适合什么人 全家人的丹尼斯供应商口令 全家人的丹尼斯供应销售查询