潜移默化学会设计模式-《1》-简单工厂模式《搭积木的例子》

一下内容皆是个人想法,只是希望将专业的东西,转化成通俗的东西,不想含有啰嗦的成分

1.学前故事:

   看了3,4个简单工厂的例子,映像最深的还是那个计算器(好像还是微软的一道面试题"计算器,用OOP实现")

   说实话,再讲模式之前,记住两个公式:  (接口命名规范,名称前面加个“  I  ”)

   IA ic=new C;

   IA id=new D;

   当参数是 IA类型时,ic,id当然都能传入,当ic调他里面的方法和属性时是C里面的,而id调他里面的方法和属性时是D里面的

   这就是多态了,如果记不住,请记住模糊的感觉,心里知道,说不出来没关系

   父类 a=new 子类1;

   父类 a=new 子类2;

   跟上面是一样的道理

   有个专业术语,叫"里氏替换原则",讨厌专业的

  这就是传说中的他们的多态了,掌握这个,java 的oop跟这个一模一样,记住这种感觉,对学习设计模式是很重要的。

  相关知识点: C# OOP  C# 接口 C# 继承 C# 多态 C#封装

 

2.开始学习 (以下内容采用第二个公式) 不想用计算器的例子,好俗~

  想啊想~想啊想~

 《搭积木》吧,小时候幼儿园的一个游戏,好怀念~

组件:各种形状的木头

动作:拿起积木搭建

 

 

首先新建一个控制台应用程序

①新建一个Wood 类,木头的总称,来基本定它的子类的模样,如果 关于 Virtual 关键字不懂的,建议先去学学oop

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

namespace SimpleFactoryDemo
{
    public class Wood
    {
        /// <summary>
        /// 木头形状
        /// </summary>
        public string WoodShape { get; set; }
        /// <summary>
        /// 木头颜色
        /// </summary>
        public string WoodColor { get; set; }

        public virtual void StartBuild()
        {
            Console.WriteLine("你拿起了" + WoodColor + "" + WoodShape + "的积木...");
            Console.WriteLine("成功了!");
        }
    }
}

然后我们开始做第一块木头,黄色的圆形的木头

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

namespace SimpleFactoryDemo
{
   public class RoundWood:Wood
    {
       public override void StartBuild()
       {
           WoodColor = "黄色";
           WoodShape = "圆形";
           base.StartBuild();
       }
    }
}

同理我们多做几块

白色的方形的木头

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

namespace SimpleFactoryDemo
{
   public class SquareWood:Wood
    {
       public override void StartBuild()
       {
           WoodColor = "白色";
           WoodShape = "方形";
           base.StartBuild();
       }
    }
}

灰色的拱形木头

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

namespace SimpleFactoryDemo
{
   public class ArchWood:Wood
    {
       public override void StartBuild()
       {
           WoodColor = "灰色";
           WoodShape = "拱形";
           base.StartBuild();
       }
    }
}

 

 好了,搭积木的原材料都有了,此时我们有三块木头了

但事实上我们根本不止三块木头,以后可能还有其他形状的其他颜色的木头,为了方便能有更多的木头,我们需要一个工厂来生产这个木头,说白了,其实是为了我们来拿木头搭建的时候更轻松,方便打下基础,拿木头的时候你就知道了

我们來建一个木头工厂吧

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

namespace SimpleFactoryDemo
{
   public class Factory
    {
       public static Wood CreateWood(string shape) {
           Wood newWood = null;
           switch (shape)
           {
               case "圆形":
                   newWood = new RoundWood();
                   break;
               case "方形":
                   newWood = new SquareWood();
                   break;
               case "拱形":
                   newWood = new ArchWood();
                   break;
               default:
                   break;
           }
           return newWood;
       }
    }
}

我这里只是根据形状来生产木头的,没有颜色,如果你想还能控制颜色你还可以加个颜色作为判断,来构成 我们的 第二个公式的样子

   父类 a=new 子类1;

   父类 a=new 子类2;

 

好了,到此为止,木头有了,哦,说错了,是积木;

        积木有了,生产积木的工厂也有了,那现在搭你想要搭的东西吧

 

在Program.cs文件里,我是这样写的

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

namespace SimpleFactoryDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Wood factory = Factory.CreateWood("方形");
            factory.StartBuild();

            Console.ReadLine();
        }
    }
}

效果

如果不考虑定死的颜色,我们现在只需要把”方形“改成    我们身边现有的形状,工厂就可以帮你生产出该形状的积木,说生产太那个了,就是创建一个有形状的积木对象给你,然后你掉这个积木的方法就行了,

用简单工厂模式,可以方便某种情况的拓展,而你并不知道这些情况共有多少个,这有情况都要有某些共同之处,就可以了

 

在看一下吧

 

         Wood factory = Factory.CreateWood("方形");
            factory.StartBuild();
            Wood factory1 = Factory.CreateWood("拱形");
            factory1.StartBuild();
            Wood factory2 = Factory.CreateWood("圆形");
            factory2.StartBuild();
            Console.ReadLine();
        }

 

效果图

 

其他例子:例如 两位数计算的计算器,用工厂创建运算方法,例如+-×÷/...

我的应用拓展:结账方式有很多,用工厂创建各种结账方式,前台调用时只要传个结账方式的名称:就可以创建那个结账方式的对象,给你调用该结帐方式的方法或者属性,以后有什么新的结账方式,添加就行了。

还有分开写类比较安全,例如 你不想某些人看到你写的某种方式的结账算法,简单工厂是很好的选择,别人只要新建一个类,写他的方法就行了,然后你在工厂那个类中添加一个结账方式就行了。

最后露一个项目结构图吧

 demo下载:http://download.csdn.net/detail/yangyanghaoran/4327225

 

posted @ 2012-05-24 18:03  AYUI框架  阅读(1512)  评论(0编辑  收藏  举报