zoukankan      html  css  js  c++  java
  • C#简单工厂模式——初遇GoF设计模式

    ---无聊的分割线---

    在面向对象程序中,我们经常看到一种模式就是简单工厂模式(Simple Factory Pattern)。也许你也没意识到原来你一直在使用简单工厂模式,没关系,很多时候我们往往只需要使用就可以了。

    简单工厂模式根据提供给它的数据,返回几个可能类中的一个类的实例。通常它返回的类都有一个共同的父类和共同的方法,但每个方法执行的任务不同,而且根据不同的数据进行了优化。简单工厂模式实际上不属于23个GoF模式,但它可以作为学习工厂方法模式的一个引导。


     

    1.先定义一个父类

    //父类
    public class Namer {
        //再次定义成员
       protected string frName, lName;
    
        //返回fName
        public string getFrname(){
            return frName;
        }
    
        //返回lName
        public string getLname(){
            return lName;
        }
    }

    2.定义两个子派生类

    两个派生类继承了Namer。并且两个类的构造函数都将name分成两部分。并且约定,最后一个空格后面所有的内容都属于frName。在子类1当中,分割符是空格,在子类2当中,分隔符是逗号。

    //子类1 
    public class FirstLast : Namer {
        public FirstLast(String name){
            int i=name.Trim().IndexOf(" ");
            if(i>0){
                frName=name.Substring(0,i).Trim();
                lName=name.Substring(i+1).Trim();            
            }
            else{
                lName=name;
                frName="";
            }
        }
    }
    
    //子类2
    public class LastFirst : Namer {
        public LastFirst(string name){
            int i=name.IndexOf(",");
            if(i>0){
                lName=name.Substring(0,i);
                frName=name.Substring(i+1).Trin();
            }
            else{
                lName=name;
                frName="";
            }
        }
    }

     这两种情况下,我们将分拆的name保存在基类Namer中的保护变量lName和frName里。

     


    3.构造简单工厂

    类已经准备好了,下面就需要构造一个简单工厂。工厂做的事情很简单,当检测到name里面有逗号时,返回一个LastFirst对象,否则返回FirstLast对象。下面是代码示例:

    //简单工厂
    public class NameFactory{
        //构造函数
        public NameFactory{}
        
        //根据判断返回不同的类
        public Namer getName(string name){
            int i=name.IndexOf(",");
            if(i>0){
                return new LastFirst(name);
            }else{
                return new FirstLast(name);
            }
        }
    }

     


    4.使用工厂

    假设一个输入文本要求输入姓名,响应button Click事件之后将姓和名分别输入在对于的文本框。下面是代码示例:

    //使用工厂
    private void btnOK_Click(object sender,System.EventArgs e){
        Namer nm=nameFact.geyName(txtName.Text);
        txtFirst.Text=nm.getFrname();
        txtLast.Text=nm.getLname();
    }

    在使用的时候,我们不需要知道使用的是哪一个派生类,工厂会为我们做出选择。

     


    结构图示

     


    小结

    简单工厂能够返回具有相同方法的类的实例,他们可以是不同的派生子类的实例,也可以是实践上毫无关系仅仅是共享了相同接口的类。不管是哪一种形式,这些实例中的方法必须是相同的,并且能够被交替使用。

    学习,从简单开始。

    所有代码

    简单工厂
    //父类
    public class Namer {
        //再次定义成员
       protected string frName, lName;
    
        //返回fName
        public string getFrname(){
            return frName;
        }
    
        //返回lName
        public string getLname(){
            return lName;
        }
    }
    
    //子类1 
    public class FirstLast : Namer {
        public FirstLast(String name){
            int i=name.Trim().IndexOf(" ");
            if(i>0){
                frName=name.Substring(0,i).Trim();
                lName=name.Substring(i+1).Trim();            
            }
            else{
                lName=name;
                frName="";
            }
        }
    }
    
    //子类2
    public class LastFirst : Namer {
        public LastFirst(string name){
            int i=name.IndexOf(",");
            if(i>0){
                lName=name.Substring(0,i);
                frName=name.Substring(i+1).Trin();
            }
            else{
                lName=name;
                frName="";
            }
        }
    }
    
    //简单工厂
    public class NameFactory{
        //构造函数
        public NameFactory{}
        
        //根据判断返回不同的类
        public Namer getName(string name){
            int i=name.IndexOf(",");
            if(i>0){
                return new LastFirst(name);
            }else{
                return new FirstLast(name);
            }
        }
    }
    
    //使用工厂
    private void btnOK_Click(object sender,System.EventArgs e){
        Namer nm=nameFact.geyName(txtName.Text);
        txtFirst.Text=nm.getFrname();
        txtLast.Text=nm.getLname();
    }

    参考资料:《C#设计模式》
  • 相关阅读:
    环境配置 | 安装Jupyter Notebook及jupyter_contrib_nbextensions库实现代码自动补全
    环境配置 | mac环境变量文件.bash_profile相关
    Django | 解决“(1146, "Table 'mydb.django_session' doesn't exist")”报错的方法
    Django | pycharm 提示 unresolved attribute referene 'objects' for class 'xxxx'
    站点中添加企业qq的几种方式
    div自适应高度
    SVN服务器搭建和使用(三)
    SVN服务器搭建和使用(二)
    SVN服务器搭建和使用(一)
    宽度为100%,缩小窗口,右侧的区域背景图片变成空白
  • 原文地址:https://www.cnblogs.com/rond/p/2444797.html
Copyright © 2011-2022 走看看