设计模式之简单工厂模式Simple Factory Pattern

本文介绍简单工厂模式的应用,通过一个姓名解析的例子展示了如何使用简单工厂模式来决定返回哪个类的实例。并给出了具体的代码实现。

在OO程序中,我们经常看到一种模式就是简单工厂模式(Simple Factory Pattern),简单工程模式根据提供给它的数据,返回几个可能类中的一个类的实例。下面我们就以一个简单的例子来说明一下简单工厂模式。

假设我们有一个输入窗体,允许用户输入他们的名字,可以是 firstname lastname 或者是lastname,firstname的,我们通过判断用户输入的名字是否有逗号来判断哪一部分是firstname,哪一部分是lastname。

先定义一个简单的类,它用构造函数接收表示名字的字符串,并且可以从类中取回名字。

 public class Namer
    {
        
protected string frName, lName;
        
public string getFrname()
        {
            
return frName;
        }
        
public string getlNmae()
        {
            
return lName;
        }
    }

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

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

 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 
= "";
            }
        }
    }
public class LastFirst : Namer
    {
        
public LastFirst(string name)
        {
            
int i = name.Trim().IndexOf(" ");
            
if (i > 0)
            {
                lName 
= name.Substring(0, i);
                frName 
= name.Substring(i + 1).Trim();
            }
            
else
            {
                lName 
= name;
                frName 
= "";
            }
        }
    }

两种情况下,我们把拆分后的名字分别保存在基类Namer的保护变量lName和frName中,注意,在派生类里根本不需要任何getFrname和getLname方法,因为已经在基类中给出。

下面就很容易给出简单工厂类。只要检测逗号是否存在,然后返回其中的一个类即可。

 public class NameFactory
    {
        
public NameFactory() { }
        
public Namer getName(string name)
        {
            
int i = name.IndexOf(",");
            
if (i > 0)
            {
                
return new LastFirst(name);
            }
            
else
            {
                
return new FirstFirst(name);
            }
        }
    }

接下来看看怎么样把上述部分组合在一起。

 private void btnOK_Click(object sender, EventArgs e)
        {
            Namer name 
= new NameFactory().getName(txtName.Text);
            txtFirstName.Text 
= name.getFrname();
            txtLastName.Text 
= name.getlNmae();
        }

下图就是得到的效果

这就是简单工厂模式的基本原理了,创建一个抽象工厂,它决定返回哪一个类的实例并将该实例返回。

简单工厂模式实际上不属于23种GoF模式。

转载于:https://www.cnblogs.com/yangxiang/archive/2011/07/13/2105782.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值