您的位置:首页 > 其它

简单工厂模式

2014-04-15 09:04 459 查看
因为刚开始学习c#不久,所以对c#中的知识懂的很少,也希望能有一些朋友一起学习或者高手前辈给予点指点,我知道我现在写的东西有很多问题,我也只是把我知道的那一点写出来,希望各位大婶婶多多指教。

我个人理解的简单工厂模式:

1.首先根据题意定义父类(基类),父类中包含需要的数据,并通过构造函数给予赋值,同时还需要一个virtual方法;

2.根据题意定义子类(派生类),子类继承父类,子类中的构造函数也base父类的构造函数,同时 重写(override)父类中方法;

3.定义工厂类,该类的返回值类型我一般写的是父类,工厂内是根据题意写的语句。

4.在主函数中调用工厂类。

下面举一个学习的例子:

磁盘上有不同的文件,比如:.txt文本文件、.avi视频文件、.xls电子表格。要求:编写一个控制台程序,用户输入一个带后缀名的文件,将该文件名传递到一个方法中,该方法中根据用户输入的文件名后缀,返回一个对应的文件对象。提示:编写不同的类模拟不同的文件、为不同的文件类创建统一的父类、使用简单工厂实现。

按照步骤来:
1.先根据题意定义父类CommonFile ,父类中有两个字段filename(文件名),extension(文件拓展名),构造函数,虚函数方法一个。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _01OpenFile练习
{
/// <summary>
/// 文件的父类,提供统一的方法
/// </summary>
class CommonFile
{
string fileName;
string extension;
public string FileName
{
get { return fileName; }
set { fileName = value; }
}
public string Extention
{
get { return extension; }
set { extension = value; }
}

public CommonFile(string fileName)
{
this.fileName = fileName;
// 在类中,直接使用字段即可,除非
// 属性对字段有约束,或者是自动属性

// 获得文件后缀名
// 使用 string Path.GetExtension(文件名)
this.extension = System.IO.Path.GetExtension(this.fileName);
}

public virtual void OpenFile()
{
Console.WriteLine("【{0}】文件,未知文件名后缀,不知如何打开", this.fileName);
}
}
}


2.再定义子类TextFile(这里子类就先定义一个txt的)子类继承父类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _01OpenFile练习
{
class TextFile:CommonFile
{
/// <summary>
/// 提供构造方法,调用父类构造方法为字段赋值
/// </summary>
/// <param name="fileName"></param>
public TextFile(string fileName)
: base(fileName)
{ }

public override void OpenFile()
{
Console.WriteLine("【{0}】文件是文本文件,后缀名是\"{1}\",使用文本文件将其打开", this.FileName, this.Extention);
}
}
}


3..定义工厂类Factory,返回值类型CommonFile
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _01OpenFile练习
{
/// <summary>
/// 这个是工厂对象
/// </summary>
class Factory
{
public static CommonFile InitialFileObject(string fileName)
{
switch (System.IO.Path.GetExtension(fileName).ToLower())
{
case ".txt":
case "txt": return new TextFile(fileName);

default: return new CommonFile(fileName);
}

}
}
}


4.主函数
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _01OpenFile练习
{
class Program
{
static void Main(string[] args)
{
// 提示用户输入
Console.WriteLine("请输入文件");
// 接收数据
string fileName = Console.ReadLine();
// 将用户输入的文件名交给工厂
CommonFile file = Factory.InitialFileObject(fileName);

file.OpenFile();

Console.ReadKey();
}
}
}


5.结果



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: