创建型模式:简单工厂

今天开始正式的学习设计模式了,有人说学习设计模式如果不编几万行代码是摸不到头脑的,以前也学习,也总是不得要领,现在感觉对OO有些理解了,也在没有学设计模式的时候用了适配器,抽象工厂等少数几个模式.
手头纸面的书关于设计模式的仅有两本:<<Gof的设计模式>>,<<C#设计模式>>,我打的例子代码都是这个书中的,说实话,这本书很烂,当时买来也主要是打算只是通过看这本书对设计模式有个总体印象.

声明一下,随笔只作为我的学习记录,言论未必正确.

简单工厂模式不属于Gof中归纳的23个模式,但是可以作为其它工厂模式的引例,其思想很简单,只是通过传递的参数来实例化具体的类,具体的类继承统一的基类,而调用者则可以不用管具体实例化的哪个类,只要使用这个基类就可以了.

下面这个例子实在恶心,不过作为练习足够了.



    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);
            }

        }

    }


    
public class Namer
    
{
        
protected string frName, lName;

        
public string getFrname()
        
{
            
return frName;
        }


        
public string getLname()
        
{
            
return lName;
        }

    }


    
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).Trim();
                frName 
= name.Substring(i + 1).Trim();
            }

            
else
            
{
                lName 
= name;
                frName 
= "";
            }

        }

    }

调用时候的代码:
//实际的项目中,这里应该使用单件模式            
NameFactory nameFact = new NameFactory();
Namer nm 
= nameFact.getName(this.textBox1.Text);
textBox2.Text 
= nm.getFrname();
textBox3.Text 
= nm.getLname();
posted @ 2008-03-05 16:24  吴东雷  阅读(280)  评论(1)    收藏  举报