Loading

设计模式——简单工厂模式的实现[备忘录]

身为一个小菜鸟,接触一下设计模式。之前听到设计模式,各种神奇,不亚于程序界的“葵花宝典”、“九阴真经”之类。

之所以写下来,如题目所述:【备忘录】,也是督促自己学习的一个过程。

最近慢慢接触后,也发现了它的神奇与巧妙。要学习面向对象,设计模式能改变我们以计算机的思维去让计算机工作的想法,要让计算机以人的思维去工作,展现其灵活与强大。学习设计模式,能深刻的去体会用面向对象的思维去思考事物。

参考:《大话设计模式》---程杰;度娘;谷哥;还有博客园的大牛们。

http://www.cnblogs.com/anlyren/archive/2008/01/31/oo.html

面向对象的好处:利用面向对象的分析编程思想,通过封装、继承、多态把程序的耦合度降低。用设计模式使得程序更加容易修改,并且易于复用。

 

 

定义:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类或接口。简单工厂模式又称为静态工厂方法(Static Factory Method)模式,属于类的创建型模式,通常根据一个条件(参数)来返回不同的类的实例。

自己的理解:创建一个类,接收客户端的不同参数,来实例化不同的类实例。

应用场景:

  • 工厂类负责创建的对象比较少 
  • 客户只知道传入了工厂类的参数,对于始何创建对象(逻辑)不关心 

优缺点:

优点:

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

缺点:

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

今天的简单工厂简要背景:利用面向对象的思想,模拟简单的计算器程序。

程序设计离不开的UML类图,今天简单工厂模式的UML图:

简单描述:将加、减、乘、除四种方法类抽象出一个共同的“运算类”;

              运算类接收两个参数  NumberA、NumberB,并有一个虚方法返回其结果;

              加、减、乘、除四种方法类均继承 “运算类”;

              构造简单工厂类通过传入“+、-、*、/”来分别实例化加、减、乘、除四种方法类的实例;

 

上代码:

运算类:

运算类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimpleFactoryPattern
{
    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;
        }
    
        
    }
}

加、减、乘、除四种方法类及构造的简单工厂类(省力写一块去了):

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimpleFactoryPattern
{
    class OperationBLL
    {
    }
    /// <summary>
    /// 加法
    /// </summary>
    internal class OperationAdd:Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA + NumberB;
            return result;            
        }

    }
    /// <summary>
    /// 减法
    /// </summary>
    internal class OperationSub:Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA - NumberB;
            return result;
        }
    }
    /// <summary>
    /// 乘法
    /// </summary>
    internal class OperationMul:Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA * NumberB;
            return result;
        }
    }
    /// <summary>
    /// 除法
    /// </summary>
    internal class OperationDiv:Operation
    {
        public override double GetResult()
        {
            double result = 0;
            if (NumberB==0)
            {
                throw new Exception("除数不能为0.");
                
            }
            result = NumberA / NumberB;
            return result;
        }
    }
    /// <summary>
    /// 简单工厂类
    /// </summary>
    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;
        }
    }
}

客户端调用代码:

/*
 * 采用面向对象的思想写出控制台计算器。
 * 运用简单工厂模式
 */

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimpleFactoryPattern
{
    class Program
    {
        static void Main(string[] args)
        {
            Operation oper;
            oper = OperationFactory.CreateOperate("+");
            oper.NumberA = 1;
            oper.NumberB = 2;
            double result = oper.GetResult();
            Console.WriteLine("输出结果:"+result);
            Console.ReadLine();

        }
    }
}

 

 

 

posted @ 2012-05-31 10:26  Cooper_Liu  阅读(360)  评论(0编辑  收藏  举报