C#简单工厂模式——初遇GoF设计模式

简介:

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

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

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


 

1.先定义一个父类


 

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#设计模式》

相关文章
|
3月前
|
数据采集 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPISDK设置软件触发模式(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPISDK设置软件触发模式(C#)
40 1
|
4月前
|
设计模式 关系型数据库 程序员
UML中常用设计模式OCP、单例模式、简单工厂模式等模式讲解及C#中代码实现(附源码)
UML中常用设计模式OCP、单例模式、简单工厂模式等模式讲解及C#中代码实现(附源码)
43 0
|
8月前
|
传感器 监控 算法
Baumer工业相机堡盟工业相机如何通过BGAPISDK设置硬件触发模式(C#)
Baumer工业相机堡盟工业相机如何通过BGAPISDK设置硬件触发模式(C#)
82 0
|
8月前
|
编解码 缓存 算法
Baumer工业相机堡盟工业相机如何通过BGAPISDK设置多帧采集模式(C#)
Baumer工业相机堡盟工业相机如何通过BGAPISDK设置多帧采集模式(C#)
67 0
|
8月前
|
算法 机器人 C#
Baumer工业相机堡盟工业相机使用BGAPISDK将工业相机设为Burst模式以及该模式的优势以及行业应用(C#)
Baumer工业相机堡盟工业相机使用BGAPISDK将工业相机设为Burst模式以及该模式的优势以及行业应用(C#)
48 0
|
设计模式 C#
【设计模式】C#实现简单工厂模式
工厂模式总结三个要点: 1、不想直接new这个类的对象,防止这个类改变的时候在new的地方到处去改,麻烦且容易遗漏; 2、这个类的对象构建过程非常复杂,不想在代码的各个地方将这么复杂的构建过程反复书写; 3、这个类的对象在构建过程中依赖了很多其他的类,而你无法在调用的地方提供。
|
算法 C#
商场促销-策略模式(和简单工厂模式很像的哇) C#
还是那几句话: 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 废话不多说,直接进入正题: 首先按照大话设计模式的解释,在这里也总结下策略模式的概念:它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算...
1578 0
|
.NET C#
代码无错就是优?简单工厂模式 C#
还是那几句话: 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 废话不多说,直接进入正题: 现在给你一道面试题,如下: 请用C++,C#,Java或VB.NET等任意一种面向对象语言实现一个计算机控制台程序,要求输入任意两个数字和一个运算符号,得到结果。
1199 0
|
关系型数据库 Go C#
C#设计模式之二工厂方法模式(Factory Method Pattern)【创建型】
原文:C#设计模式之二工厂方法模式(Factory Method Pattern)【创建型】 一、引言       在上一篇文章中我们讲解了过渡的一种模式叫做【简单工厂】,也有叫【静态工厂】的,通过对简单工厂模式得了解,我们也发现了它的缺点,就是随着需求的变化我们要不停地修改工厂里面的方法的代码,需求变化越多,里面的If--Else--也越多,这样就会造成简单工厂的实现逻辑过于复杂。
1542 0
|
C#
C#设计模式(19)——状态者模式(State Pattern)
原文:C#设计模式(19)——状态者模式(State Pattern) 一、引言   在上一篇文章介绍到可以使用状态者模式和观察者模式来解决中介者模式存在的问题,在本文中将首先通过一个银行账户的例子来解释状态者模式,通过这个例子使大家可以对状态者模式有一个清楚的认识,接着,再使用状态者模式来解决上一篇文章中提出的问题。
1058 0