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

相关推荐
rockey6271 小时前
AScript之字符串模板
c#·.net·script·expression·动态脚本
moshuying1 小时前
网购能买Token了!
前端
h_65432102 小时前
echarts实现柱状图加一条横线
前端·echarts
风骏时光牛马2 小时前
生成一个后端标题,只需要一个标题,不需要其他的任何文本。
前端
子非鱼@Itfuture2 小时前
关于前后端联调中登录状态/登录信息失效?
java·前端
郭小李2 小时前
openFeign入门
java·开发语言·前端
will_net2 小时前
Redis集群部署+Redis 链接地址放入Aollo +c#项目接入Redis
redis·c#·bootstrap
馒头不想说话2 小时前
AI当运营,帮你省人力
前端
梦曦i2 小时前
uni-app x下自研架构的工程化突围
前端·架构·uni-app x
速易达网络2 小时前
ECharts 图表制作完全指南:从零到可视化实战
前端·javascript·echarts