fyun之我见之简单工厂模式
一直以来对设计模式接触都很多,但从来没有好好的将其归纳与分析,导致自己在使用和知识积累过程中总找不到一个可以好好的拿来给人分享及培训的东西。这里我将通过将GOF的23中设计模式一一介绍,并对其用途及在使用项目中的体会写出,其次会在之间写入一些模式之间的比较或相关知识。或许自己看的的只是冰山一角,也希望能得到更好的见解已自己分享或讨论。之下我将展示简单工厂模式的基本设计原理及思路。
一: 简单工厂模式之我见
个人理解简单工厂模式就是:
实例化合适的对象,通过多态,返回给父类(基类)的方式。
解读:说白了就是我们要找出其中公共的东西(即:属性和方法),将所有公共的东西放在父类,然后再各自的子类中分别去实现。
二:针对面试
我们很多人在面试时或许会被问到了解OO中的多态是什么意思,或具体体现。这里简单工厂模式就是一个多态应用的体现,只要你理解了简单工厂模式,那么在你面试中再碰到多态这类问题,我想应该是信手拈来,侃侃而谈吧。
三:举列
废话不多说了,咱言归正传,接下来将以常遇到的数据库读取问题来展开对简单工厂的设计与分析:
这里我们就以:用你熟悉的JAVA、C\C++、C#、VB.NET等任意一种面向对象语言实现一个控制器程序,要求输入查询语句获取所需数据。
分析问题:
得到题目的过程,我们可能会想当然的把自己常用的数据库读取的方法一下子就构建起来,比如,我是一个常用MSSQL SERVER的程序员,首先就想到,这个问题太easy了,不就创建个SQL CONNECTION并打开,执行SQL CMD, 再用SQL ADAPTER来把数据装入DATASET中然后输。表面看起来一点问题也没有,确实实现了我们的需要的结果。
问题一:我的程序是否满足面向对象开发?
问题二:如果我需要同时支持MSSQL、ORACLE、MYSQL怎么办?
问题三:我们的代码是否能够在新增数据库种类读取时候只需要简单的添加一个新的数据库读取就能实现?
以上三个问题让我们
想到面向对象开发是通过继承、封装、多态把程序的耦合度降低,想到通过设计模式来使得程序更加灵活、容易修改并且易于复用。
四:例子设计(部分源码)
设计类图:
看类图设计简单吧,这就是一个简单的工厂模式开发的简单类构建,基本实现代码如下:
public class Reader
{
private string dbcnstr= '';
public string Dbcnstr
{
get{ return dbcnstr;}
set{ dbcnstr=value;}
}
public virtual System.Data.DataSet Select(string cmdText)
{
return null;
}
}
// MSSQL子类
public class MSSQLReader : Reader // 当然我这里用的是C#.如JAVA冒号改为extends。具体我就不一一写了。主要还是用比较用的熟悉的C#语言了。
{
public override System.Data.DataSet Select(string sqlcmdText)
{
// MSSQL读取数据集代码。
using(SqlConnection sqlcn = new SqlConnection(Dbcnstr)
{
sqlcn.open();
SqlCommand sqlcmd = new SqlCommand(sqlcmdText,sqlcn);
SqlDataAdapter sqladapter = new SqlDataAdapter(sqlcmd);
DataSet ds = new DataSet();
sqladapter.Fill(ds, "mytable");
return ds;
}
}
}
public class ORACLEReader : Reader
{
public override System.Data.DataSet Select(string sqlcmdText)
{
// ORACLE读取数据集代码。
.....
return ds;
}
}
public class MYSQLReader : Reader
{
public override System.Data.DataSet Select(string sqlcmdText)
{
// ORACLE读取数据集代码。
.....
return ds;
}
}
// 定义数据库读取枚举
public enum ReadDbType
{
MSSQL,
ORACLE,
MYSQL
}
// 简单工厂类
public class ReaderFactory
{
public static Reader CreateReader(ReadDbType type)
{
switch(type)
{
case ReadDbType.MSSQL: return new MSSQLReader();
case ReadDbType.ORACLE: return new ORACLEReader();
case ReadDbType.MYSQL: return new MYSQLReader();
default: throw new Exception('不支持读取数据库类型')
}
}
}
//客户端应用:
static void Main(string[] args)
{
try
{
Console.Write("请输入查询语句:");
string cmdtext= Console.ReadLine();
Console.Write("请输入数据库类型:");
string dbtype = Console.ReadLine();
Reader read = ReaderFactory.CreateReader(cmdtext,(ReadDbType)Enum.Parse(typeof(ReadDbType),dbtype));
read.Dbcnstr= GetCnstr(dbtype); // 该方法在例子就省去了...
DataSet ds = read.Select(cmdtext.Trim());
...
...
Console.WriteLine(....);
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine("读取出错:" + ex.Message);
}
}
上面写的代码是我在MSDN编辑框直接写的,没有通过VS工具,如有错误请原谅
总结:
简单工厂模式的设计理念就是通过工厂来完成子类的实现过程,从而始终使用基类来完成各个子类的过程。它可以让我们在以后的扩充上能过达到只需要增加子类的实现及在工厂实例化时加上对应条件就可以使用。 哈哈 简单吧
分享知识是一种快乐,也是进一步学习巩固的基石。
这里简单工厂就描述到这里了,接下来我将介绍策略模式。希望大家多给意见。也希望我在接下来的时间能够写的更好。