博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
大话设计模式读书笔记7——工厂方法模式
阅读量:6691 次
发布时间:2019-06-25

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

工厂方法模式

工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到其子类。

工厂方法模式UML结构图

工厂方法模式结构代码

///     /// 声明'Product' 抽象类    ///     abstract class Product    {    }    ///     /// 声明 'ConcreteProductA' 类,继承Product    ///     class ConcreteProductA : Product    {    }    ///     ///  声明 'ConcreteProductB 类,继承Product    ///     class ConcreteProductB : Product    {    }    ///     /// 声明 'Creator' 抽象类    ///     abstract class Creator    {        //工厂方法        public abstract Product FactoryMethod();    }    ///     /// 声明 'ConcreteCreatorA' 类,继承Creator类    ///     class ConcreteCreatorA : Creator    {        //实现父类工厂方法返回类ConcreteProductA实例        public override Product FactoryMethod()        {            return new ConcreteProductA();        }    }    ///     ///  声明 'ConcreteCreatorB' 类,继承Creator类    ///     class ConcreteCreatorB : Creator    {        //实现父类工厂方法返回类ConcreteProductB实例        public override Product FactoryMethod()        {            return new ConcreteProductB();        }    }    class Program    {        static void Main(string[] args)        {                      Creator[] creators = new Creator[2];            creators[0] = new ConcreteCreatorA();            creators[1] = new ConcreteCreatorB();                       foreach (Creator creator in creators)            {                Product product = creator.FactoryMethod();                Console.WriteLine("Created {0}",product.GetType().Name);            }                       Console.ReadKey();        }    }

 执行结果:

工厂模式实例代码

///     /// 运算类    ///    public class Operation    {        public double NumA { get; set; }        public double NumB { get; set; }        public virtual double GetResult()        {            double result = 0;            return result;        }    }    ///     /// 加法类    ///    public class OperationAdd : Operation    {        public override double GetResult()        {            double result = 0;            result = NumA + NumB;            return result;        }    }    ///     /// 减法类    ///     public class OperationSub : Operation    {        public override double GetResult()        {            double result = 0;            result = NumA - NumB;            return result;        }    }    ///     /// 工厂接口    ///     public interface IFactory    {        Operation FactoryMethod();    }    ///     /// 加法工厂    ///     public class AddFactory : IFactory    {        public Operation FactoryMethod()        {            return new OperationAdd();        }    }    ///     /// 减法工厂    ///     public class SubFactory : IFactory    {        public Operation FactoryMethod()        {            return new OperationSub();        }    }   class Program    {        static void Main(string[] args)        {            IFactory[] fac = new IFactory[2];            fac[0] = new AddFactory();            fac[1] = new SubFactory();            Operation oper;            oper = fac[0].FactoryMethod();            oper.NumA=10;            oper.NumB=5;            Console.WriteLine("Called By {0}", oper.GetType().Name);            Console.WriteLine("Result={0}", oper.GetResult().ToString());                     oper = fac[1].FactoryMethod();            oper.NumA = 10;            oper.NumB = 5;            Console.WriteLine("Called By {0}", oper.GetType().Name);            Console.WriteLine("Result={0}", oper.GetResult().ToString());            Console.ReadKey();        }    }

 运行结果:

简单工厂模式和工厂方法模式的区别

简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。

工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。如想要加功能,本来是改工厂类的,而现在是修改客户端。

转载于:https://www.cnblogs.com/lxblog/p/4119426.html

你可能感兴趣的文章
云适配开放平台内测“挑刺有奖” 我的地盘你做主
查看>>
“花旗小妹”的炼成之道:明天会更好吗?
查看>>
思佳客.雲
查看>>
SUSE Linux的CPU节电模式引发的故障案例解析
查看>>
美要求搜索引擎标广告,国内搜索需反省
查看>>
Lync Server 2010标准版与企业版的区别
查看>>
CentOS 7之Postfix部署系列(三)postfix、Dovecot及Cyrus-sas配置
查看>>
男人在神永恒国度里的沉思录
查看>>
SCOM 2012知识分享-20:管理用户角色
查看>>
DPM2012R2-case:无法枚举受保护的计算机上的一个或多个共享
查看>>
《从零开始学Swift》学习笔记(Day 30)——选择类还是结构体呢?
查看>>
LaTeXila:Linux 的多语言 LaTeX 编辑器简介
查看>>
恭喜CocoStudio 1.5和Mac版本发布
查看>>
Chrome的JS调试工具
查看>>
OnClientClick和OnClick同时使用!
查看>>
把时间转成适合符合日常习惯的格式【js】
查看>>
c 数组
查看>>
Kafka 跨集群同步方案(转)
查看>>
LEA指令
查看>>
Delphi MaskEdit用法(转)
查看>>