设计模式------工厂方法模式

工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类.

角色:

1.抽象工厂(Creator)角色:

是工厂方法模式的核心,与应用程序无关。任何在模式中创建对象的工厂类必须实现这个接口。


2.具体工厂(ConcreteCreator)角色:

这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。


3.抽象产品(Product)角色:

工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。


4.具体产品(ConcreteProduct)角色:

这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。


结构图:



适用情况:

1.对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。

2.只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程对于使用者来说是透明的。


工厂方法模式VS简单工厂模式:

 下面以编写“计算器”的小程序为例,对比学习工厂方法模式。


1.简单工厂模式:


简单工厂类:


工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类。对于客户端来说,去除了与具体产品的依赖。当增加其他算法时,需要在工厂类中加case分支条件,这样就违背了“开放-封闭原则”。

简单工厂模式链接


2.工厂方法模式:


 
工厂方法模式对简单工厂模式进行了抽象,将简单工厂的内部逻辑判断移到了客户端中。它有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,只制定一些规范,具体的生产工作由其子类去完成。


工厂方法模式实现:

运算类:

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
    {
       ...
    }

乘法类:

 class OperationMul : Operation
    {
        ...
    }

除法类:

 class OperationDiv : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            if (NumberB == 0)
                throw new Exception("除数不能为0。");
            result = NumberA / NumberB;
            return result;
        }
    }

根据依赖倒转原则,把工厂类抽象出一个接口,这个接口具有一个创建抽象产品的工厂方法,所有生产具体类的工厂,都要实现这个接口。

工厂类

 interface IFactory
    {
        Operation CreateOperation();
    }

加法工厂:

 // 专门负责生产“+”的工厂
    
    class AddFactory : IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationAdd();
        }
    }

减法工厂:

 // 专门负责生产“-”的工厂
    
    class SubFactory : IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationSub();
        }
    }

乘法工厂:...

除法工厂:...

客户端:

  static void Main(string[] args)
        {
            IFactory operFactory = new AddFactory();//进行其他运算时,只需在此修改即可
            Operation oper = operFactory.CreateOperation();
            oper.NumberA = 1;
            oper.NumberB = 2;
            double result=oper.GetResult();

            Console.WriteLine(result);

            Console.Read();
        }

最后在控制台窗口显示得数“3”。


分析:

核心工厂类不再负责产品的创建,成为一个抽象工厂角色,使一个类的实例化延迟到其子类,这样进一步抽象化使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。当增加新的算法时,不需更改原有的工厂类,只需增加此功能的运算类和相应的具体生产工厂,只对扩展开放,对修改关闭,弥补了简单工厂的不足,仍保持封装对象创建过程的优点,降低了客户程序与产品对象的耦合。工厂方法的缺点就是每增加一个产品,需要增加这个产品工厂的类,利用反射技术可以进行完善。


小编寄语:通过写博客,加深了理解,沉淀了知识。欢迎大家指点,我们共同进步。

 

 


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值