zoukankan      html  css  js  c++  java
  • 潜移默化学会设计模式《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

     

  • 相关阅读:
    c/c++中两颗璀璨的明珠
    deepin软件中心打不开
    shell之rm -rf的别名设置
    历史命令脚本
    mysql之7xtrabackup
    python之3内置容器
    python之第一个例子hello world
    python之安装
    shell脚本练习(autocert)
    【转】nginx之逻辑运算
  • 原文地址:https://www.cnblogs.com/AaronYang/p/2515134.html
Copyright © 2011-2022 走看看