读书笔记6:工厂方法模式

来源:互联网 发布:苏州网络犯罪举报网站 编辑:程序博客网 时间:2024/05/18 23:13
 1、概念

    定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延伸到子类。

2、背景

    已经知道工厂模式,有一个父类SuperClass,以及这个父类的不同实现方法和算法的若干个子类ClassA,ClassB... ...,有一个工厂类DAOFactory,根据客户端传来的标识决定调用哪个子类。如下:

using System;using System.Collections.Generic;using System.Text;namespace FactoryPattern{    public abstract class SuperClass    {        public abstract void GetResult();    }    public class ClassA:SuperClass    {        public override void GetResult()        {            Console.WriteLine("A类对GetResult()的实现。");        }    }    public class ClassB : SuperClass    {        public override void GetResult()        {            Console.WriteLine("B类对GetResult()的实现。");        }    }    public class DAOFactory    {        static SuperClass super;        public static SuperClass CreateSuperClass(string type)        {            switch (type)            {                case "A":                    super = new ClassA();                    break;                case "B":                    super = new ClassB();                    break;                default:                    break;            }            return super;        }    }}

客户端

using System;using System.Collections.Generic;using System.Text;namespace FactoryPattern{    class Program    {        static void Main(string[] args)        {            SuperClass sup;            sup = DAOFactory.CreateSuperClass("A");            sup.GetResult();             sup = DAOFactory.CreateSuperClass("B");            sup.GetResult();            Console.ReadLine();        }    }}

结果

 

可以看出,简单工厂模式是把到底实例化哪个类的逻辑放在工厂里判断,客户端不需要知道调用的哪个类,只关心结果就可以了。但是这里有一个问题,如果需求有了变化。那么就要增加新的类ClassC,ClassD… … 增加类不影响程序是可行的,但工厂类中的switch分支要不断地加,也就是要不断修改DAOFactory类,不符合开放封闭原则(程序实体可以扩展,但不被修改)。那么如何解决?

 3、工厂方法模式

    根据问题,可以有这样的方案,类ClassC,ClassD照常增加,但是需要修改工厂类。

using System;using System.Collections.Generic;using System.Text;namespace FactoryPattern{    public abstract class SuperClass    {        public abstract void GetResult();    }    public class ClassA:SuperClass    {        public override void GetResult()        {            Console.WriteLine("A类对GetResult()的实现。");        }    }    public class ClassB : SuperClass    {        public override void GetResult()        {            Console.WriteLine("B类对GetResult()的实现。");        }    }     public class ClassC : SuperClass    {        public override void GetResult()        {            Console.WriteLine("C类对GetResult()的实现。");        }    }    public class ClassD : SuperClass    {        public override void GetResult()        {            Console.WriteLine("D类对GetResult()的实现。");        }    }    public interface IFactory    {        SuperClass CreateSuperClass();    }    public class AFactory : IFactory    {        public SuperClass CreateSuperClass()        {            return new ClassA();        }    }    public class BFactory : IFactory    {        public SuperClass CreateSuperClass()        {            return new ClassB();        }    }    public class CFactory : IFactory    {        public SuperClass CreateSuperClass()        {            return new ClassC();        }    }    public class DFactory : IFactory    {        public SuperClass CreateSuperClass()        {            return new ClassD();        }    }}

客户端

using System;using System.Collections.Generic;using System.Text;namespace FactoryPattern{    class Program    {        static void Main(string[] args)        {            IFactory factory;            SuperClass sup;            factory = new CFactory();            sup = factory.CreateSuperClass();            sup.GetResult();            factory = new DFactory();            sup = factory.CreateSuperClass();            sup.GetResult();                        Console.ReadLine();        }    }}

结果

这样,解决了修改分支的问题。但是把选择交给了客户端,需要客户端自己判断到底需要调用哪个类实现,如果需求变化客户端就需要修改。事物都是具有两面性的,因此到底使用哪种模式还需要在程序中视情况而定。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 如果台湾发生骚乱大陆怎么办 80端口被占用了怎么办? qq邮箱服务器密码忘记了怎么办 对方身份异常请验证怎么办 qq附近人屏蔽了怎么办 快递地址填错了怎么办 快递填错地址已经发货怎么办 淘宝受到卖家威胁怎么办 消费者被外卖商家威胁怎么办 拼多多商家打电话威胁怎么办 退款被拒商家还威胁怎么办? 打错电话给领导怎么办 领导送礼物给我怎么办 南瓜饼和面很稀怎么办 包饺子剩的肉馅怎么办 发好的面团粘手怎么办 富士变频器减速时间过电流怎么办 铺木地板地面不是很平怎么办 眼镜被铁锈烫了怎么办 平车机针头小了怎么办 mk包五金坏了怎么办 迁坟原来的棺材怎么办 新建定额项目没有措施项目怎么办 太岁符忘记烧了怎么办 穿裙子去了寺庙怎么办 美甲彩绘胶干了怎么办 美甲彩绘胶稀怎么办 彩绘胶弄衣服上怎么办 彩绘胶买来太稠怎么办 做指甲没有底胶怎么办 交定金后发现房屋不合法怎么办 买车付了定金不想要了怎么办 买车付定金后不想要怎么办 非法经营的产品至人伤亡怎么办 返修漆施工不对色怎么办 叶子板撞变形了怎么办 挤了三角区疖子怎么办 三角部位太鼓的怎么办 美利车车贷逾期怎么办? 外墙保温层坏了怎么办 双胞胎34周血压高怎么办