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();
}

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

 


结构图示

 

 


小结

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

学习,从简单开始。

所有代码

简单工厂

 


参考资料:《C#设计模式》

相关文章
|
5月前
|
设计模式 Java 数据库
小谈设计模式(2)—简单工厂模式
小谈设计模式(2)—简单工厂模式
|
5月前
|
设计模式 Java
小谈设计模式(9)—工厂方法模式
小谈设计模式(9)—工厂方法模式
|
5月前
|
设计模式 Java
小谈设计模式(16)—抽象工厂模式
小谈设计模式(16)—抽象工厂模式
|
5月前
|
设计模式 Java
小谈设计模式(14)—建造者模式
小谈设计模式(14)—建造者模式
|
5月前
|
设计模式 Java
小谈设计模式(7)—装饰模式
小谈设计模式(7)—装饰模式
|
5月前
|
设计模式 Java Spring
|
5月前
|
设计模式 Java
设计模式再探——适配器模式
设计模式再探——适配器模式
|
5月前
|
设计模式 算法
设计模式再探——模板方法模式
设计模式再探——模板方法模式
|
设计模式 Java 程序员
寂然解读设计模式 - 工厂模式 - 抽象工厂模式
其实抽象工厂模式代码层面并不难,重点在于分析过程和类图的关系要清晰,其实这两种方式差别是有的,但是不大,核心思想大同小异,抽象工厂模式只不过把工厂抽象成了两层,而简单工厂模式就是一个工厂类,但是大多数情况下,一个工厂类很难满足复杂业务逻辑下多种不同类型的实例的创建,这个时候,使用抽象工厂模式搭建,会更显得得心应手,所以,虽然工厂模式有三种,但是大家要根据实际情况灵活运用,切忌不要为了用而用
192 0
寂然解读设计模式 - 工厂模式 - 抽象工厂模式
|
设计模式 Java
寂然解读设计模式 - 工厂模式 - 简单工厂模式
简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为,在简单工厂模式中,可以根据参数的不同返回不同类的实例 在软件开发中,当我们涉及到大量的创建某种或者某类对象时,就会使用到工厂模式,你只需要使用工厂对象来需创建对象即可,具体的创建细节被工厂对象封装起来
220 0
寂然解读设计模式 - 工厂模式 - 简单工厂模式