C# 简单工厂模式(简单工厂模式如何工作)

在OO程序中,我们经常看到的一种模式就是简单工厂模式(SimpleFactoryPattem)。简单工

厂模式根据提供给它的数据,返回几个可能类中的一个类的实例。通常它返回的类都有一个共同的

父类和共同的方法,但每个方法执行的任务不同,而且根据不同的数据进行了优化。简单工厂模式

实际上不属于23个GoF模式,但它可以作为我们稍后要讨论的工厂方法模式的一个引导。

简单工厂模式如何工作

为了理解简单工厂模式,我们来看图8.1中的类图。在该图中,X是一个基类,XY类和XZ类

从它派生出来,类根据给出的参数决定返回哪一个子类。在右边定义了一个方法,

传递给它某个值(如abc),然后返回类X的某个实例。返回哪一个类的实例与程序员无关,因为这

些类有同样的方法,只是实现不同。返回哪一个类的实例完全取决于工厂,工厂功能可能很复杂,

但通常都是相当简单的。

示例代码

接下来考虑一个简单的C#例子,在它里面用到了Factory类。假设我们有一个输入窗体,允许

用户输入他的姓名,可以是"firstname lastname"形式或"lastname,firstname"形式。现在进一步

简化这个问题,假设我们总是能通过判断lastname和firstname之间是否有逗号来确定姓名的顺序。

这是一个相当容易做出的判断,可以在类中用一个简单的评语句实现,但是,我们这里是用它

说明工厂如何工作以及工厂能生成哪些对象。先定义一个简单的类,它用构造函数接收表示名字的

字符串,并且可以从类中取回名字。

csharp 复制代码
public class Namer
{
    protected string frName,lName;

    public string getFrname()
    {
        return frName;
    }

    public string getLname()
    {
        return _Name;
    }
}

注意,在这个基类里没有设置名序的构造函数。

两个派生类

接下来编写两个非常简单的派生类,它们实现了接口,并在构造函数中将名字分成了两部分。

在FirstFirst类中,做了一个简单的假设:最后一个空格前面的所有部分都属于firstname。

csharp 复制代码
public class FirstFirst:Namer{
    public FirstFirst(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="";
        }
    }
}

在LastFirst类里,用逗号给lastname划分界限。当空格或逗号不存在时,两个类里都提供了错

误校正处理。

csharp 复制代码
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).Trim();
        }
        else
        {
            lName=name;
            frName="";
        }
    }
}

两种情况下,我们把拆分后的名字分别保存在基类Namer中的保护变量和frName里。

注意,在派生类里根本不需要任何getFrname和getLname方法,因为已经在基类里给出来了。

相关推荐
_lucas8 分钟前
做了一个glsl在线调试工具
前端·javascript·three.js
不好听6138 小时前
从一行 JSX 到屏幕像素:前端开发者必须懂的浏览器渲染管线
前端
EIP低代码平台8 小时前
EIP 低代码平台 - 角色维护
低代码·c#·权限·工作流·netcore
恒拓高科WorkPlus8 小时前
企业级内网即时通讯建设模型:BeeWorks内网IM四层架构
前端
前端小李子9 小时前
前端环境变量裸奔?我用 EnvShield 给它穿了件防弹衣
前端
youtootech9 小时前
HarmonyOS《柚兔学伴》项目实战25-我的页面、Web 嵌入与项目总结
前端·华为·harmonyos
小林ixn10 小时前
从零到一理解 React 父子组件通信:手写一个 Todo 应用带你彻底搞懂单向数据流
前端·javascript·react.js
醇氧11 小时前
CountDownLatch / CyclicBarrier / Semaphore 面试高频问答清单
前端·面试·职场和发展
qetfw13 小时前
MXU:Tauri 2 + React 的 MaaFramework 跨平台 GUI 源码
前端·python·react.js·前端框架·开源项目·效率工具