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方法,因为已经在基类里给出来了。

相关推荐
子兮曰17 小时前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰17 小时前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
小羊没烦恼!17 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
前端小万18 小时前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝18 小时前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
神仙别闹18 小时前
基于C#+MySQL实现(WinForm)个人聊天室软件
c#
三十而立洋18 小时前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁19 小时前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
kybs199120 小时前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
汉堡大王952720 小时前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端