new A广告纸();break;
case B : return new B广告纸();break;
//……..
//如果没有满足的型别码则调用父类的实现返回一个默认广告纸
default : base.Get广告纸(型别码);
}
}
}
其中 默认广告纸,A广告纸,B广告纸都是广告纸的子类。然后流水线就依赖这个Creator类,Creator类是一个稳定的类。有人说,把广告纸创建的工作分离到另外一个类就可以了,干吗那么麻烦还要弄个父类,然后弄个继承啊。记不记得有个原则叫SDP(稳定依赖原则,朝着稳定的方向进行依赖)?流水线依赖这个稳定的Creator类,子类让他自己弄去吧。
看到上面的例子我们并没有抑制变化的发生(这是不可能的),但是我们封装了变化而提供了不变的接口。
DotNet中的工厂方法
ado.net 2.0中微软在原来的IDBConnection和具体实现 如 SqlConnection等之间增加了一个抽象类DBConnection,将一些重复东西放到这个抽象层。DBConnection里有个CreateCommand,这就是一个工厂方法,由于有了这个方法的存在我们可以写出这样的代码:
public override User GetUserByUserName(string userName)
{
using (DbConnection conn = GetConnection())
{
User u;
using (DbCommand comm = conn.CreateCommand())
{
comm.CommandType = CommandType.Text;
comm.CommandText = GETUSERBYUSERNAME_TRAP_USER;
SetUserNameParam(userName, comm);
conn.Open();
using (DbDataReader reader = comm.ExecuteReader(CommandBehavior.CloseConnection))
{
if (!reader.Read()) return n