【B2B研发商城】 【加入收藏】 【设为首页】 【进入论坛】 【站点地图】

你的位置:中国研发网 >> 技术文章 >> 软件设计 >> 软件工程 >> 详细内容 在线投稿

设计模式实践之从工厂模式到创建模式整体源码分析

热度160票  浏览26次 【共0条评论】【我要评论 时间:2010年1月14日 12:33
设计模式的范围极广, 我最近也是略来整理与研究了一下, 感觉每一段时间整理一下自己学到的东西, 会发现得到的知识会比以前学的更多更全面,不然都是散散的在脑袋里面。下面例子是一个大型企业的计算工资模式, 因为有很多各地的子公司, 当然计算工资的方法也是不同的。

先定义一个接口, 确定计算工资的方法, 如下:
using System;

namespace ConsoleApp
{
    public interface ISalary
    {
        void CommandSalary();
    }
}

 

下面各地不同的子公司分别继承这个接口的CommandSalary方法,下面是深圳与北京二个地方的计算方法。设计二个类如下:
代码
using System;

namespace ConsoleApp
{
    public class ShenZhenSalary : ISalary
    {
        public void CommandSalary()
        {
            Console.WriteLine("这是深圳子公司的工资计算模块");
        }
    }
}

 

 北京子公司
代码
using System;

namespace ConsoleApp
{
    public class BeiJinSalary : ISalary
    {
        public void CommandSalary()
        {
            Console.WriteLine("这是北京子公司的工资计算模块");
        }
    }
}

 

到里面基本类已经设计完成, 好多人都会在代码中要用到时候new一个出来,这样的代码可能会造成难以维护, 给人好乱的感觉。 或像下面的代码那样调用,代码如下:
代码
using System;

namespace ConsoleApp
{
    class Program
    {
        public static void Main(string[] args)
        {
            ISalary Salary = CreateSalary("BeiJin");  //需要调用子公司的工资计算过程时, 把子公司的名称传进去
            Salary.CommandSalary();
            Console.ReadLine();
        }

        /// <summary>
        /// 通过传进的公司名返回相应的实例
        /// </summary>
        /// <param name="CompanyName">子公司的名称</param>
        /// <returns></returns>
        private static ISalary CreateSalary(string CompanyName)
        {
            ISalary Salary = null;
            if (CompanyName == "ShenZhen")  //这里可以通过更多方法来判断,通过不同的名返回相应的实例
            {
                Salary = new ShenZhenSalary();
            }
            else if (CompanyName == "BeiJin")
            {
                Salary = new BeiJinSalary();
            }
            return Salary;
        }
    }
}

 

这样就可以调用计算得到各子公司的工资, 对于小型的公司, 这样的设计已经是相当的完美了, 但对于一个大公司,子公司可能有几十个更甚至几百个, 这样在CreateSalary中就需要更多的if来判断了, 这显然对维护是极为不好的, 那需要怎样设计呢?这就是所要讨论到的设计模式了, 下面接着的文章就会是常用的工厂模式来编写这个模块。

注:这是一个新手常用的写法,这还没讲到工厂模式,这里只是说这样写的类不好,不符合系统的设计模式, 先举个反例, 后面将会介绍设计模式。有些朋友没看清楚, 标注一下。

 

(注:这是个人学习过程的心得,可能存在极大的错误,请大家指正)

[/导读]

 

平时在园子里看到有人质疑, 简单工厂模式到底是怎样设计的呢? 下面就来介绍一下它的含义。

简单的工厂模式,是属于创建型的模式, 创建型模式简单的理解就会创建对象并返回相应的实例。所以它关注的是谁创建它,它是怎样被创建的,以及何时创建这些方面给予你很大的灵活性。 具体的含义, 资料上是这样介绍: 简单工厂模式又叫静态工厂方法模式, 它定义一个具体的工厂类来负责创建一些类的实例。 也就是说, 这个类集合了部分功能类似或近似类的实例化, 例如子公司工资计算的类, 不管是那个子公司(因为子公司计算类都继承了ISalary接口, 所以有前面的相似或近似的特征), 要实例化时,都通过一个类来完成, 这类就是一个工厂类。 下面一起来看一下简单工厂模式是怎样创建工资计算模块的。

下面看看代码, 先创建接口,定义其方法:
using System;

namespace ConsoleApp
{
    public interface ISalary
    {
        void CommandSalary();
    }
}

 

二个子公司计算的类:
代码
using System;

namespace ConsoleApp
{
    public class ShenZhenSalary : ISalary
    {
        public void CommandSalary()
        {
            Console.WriteLine("这是深圳子公司的工资计算模块");
        }
    }
}

 

本站所有文章欢迎任何形式的转载,但请注明作者及出处,尊重他人劳动成果!
文章转载自:中国研发网 [http://www.yanfaw.com]
本文标题:设计模式实践之从工厂模式到创建模式整体源码分析
TAG: 实践 工厂 模式 源码 设计
顶:8 踩:8
对本文中的事件或人物打分:
当前平均分:-1 (50次打分)
对本篇资讯内容的质量打分:
当前平均分:0.65 (49次打分)
【已经有45人表态】
5票
感动
5票
路过
4票
高兴
4票
难过
6票
搞笑
6票
愤怒
6票
无聊
9票
同情
上一篇 下一篇
发表评论

网友评论仅供网友表达个人看法,并不表明本网同意其观点或证实其描述。

查看全部回复【已有0位网友发表了看法】