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

相关推荐
前端小D10 分钟前
网页渲染过程
前端
UXbot1 小时前
无需设计经验也能做原型:AI辅助工具功能评测
前端·人工智能·低代码·ui·ios·交互
Csvn1 小时前
前端架构设计:构建可维护的大型应用
前端
lichenyang4531 小时前
鸿蒙 ArkUI 走马灯卡片实战:从官方文档检索到 Swiper 实现
前端
喵个咪1 小时前
吃透后台权限系统:从架构设计到 Vue3/React 双框架完整落地
前端·vue.js·react.js
一起逃去看海吧1 小时前
对接LangSmith
java·前端·数据库
wyhwust1 小时前
web应用技术-第一次课后作业
java·前端·数据库
问心无愧05131 小时前
ctf show web入门257
android·前端·笔记
学且思1 小时前
Vue3 Patch 算法深度解析:从原理到源码实现
前端·vue.js