简单工厂模式
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.结果
我个人理解的简单工厂模式:
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.结果
相关文章推荐
- 工厂模式的简单理解
- 设计模式:简单工厂
- PHP 设计模式 简单工厂和工厂模式
- 设计模式 之 简单工厂与工厂方法
- 设计模式对比之 简单工厂方法模式vs策略模式
- 简单工厂模式--不是GOF的23个的模式
- 简单工厂模式——接口使用
- 简单工厂模式
- java 枚举和反射 实现简单的工厂模式
- 设计模式—简单工厂
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别
- 设计模式--简单工厂模式在unity3d里面的使用
- 设计模式——三个工厂模式(简单工厂,工厂方法,抽象工厂)
- 201802121524->深入浅出设计模式:c#简单工厂模式
- 实战设计模式之简单工厂
- PHP设计模式——简单工厂
- 一起来学设计模式-----创建型模式之简单工厂
- 简单工厂模式
- 简单工厂模式和策略模式
- 设计模式——简单工厂模型