Factory Method 工廠方法模式(創建型模式)
定義一個用于創建對象的接口,讓子類決定實例化哪一個類。Factory Method使得一個類的實例話延遲到子類。
———《設計模式》GoF
在接口IDAL層定義一個接口,該接口中方法表示發送不同短信消息。
//定義一個接口
public interface IMessage
{
void SendMessage(object Msg); //用于發送短信內容
}
在SERVER層實現IDAL的接口,一個用來發送天氣預報短信,一個用來發送新聞短信。
public class WeatherSMS : IMessage
{
public void SendMessage(object msg)
{
Console.WriteLine("發送給定制天氣預報短信業務的客戶:{0};", msg);
}
}
public class NewsSMS : IMessage
{
public void SendMessage(object msg)
{
Console.WriteLine("發送給定制新聞短信業務的客戶:{0};", msg);
}
}
創建IDAL的工廠:
public interface IMessageFactory
{
IMessage Create();
}
public class WeatherSMSFactory : IMessageFactory
{
public IMessage Create()
{
return new WeatherSMS();
}
}
public class NewsSMSFactory : IMessageFactory
{
public IMessage Create()
{
return new NewsSMS();
}
}
實現DAL的工廠:
static class MessageUtility
{
public static IMessageFactory weather = new WeatherSMSFactory(); //實現天氣預報短信的發送
public static IMessageFactory news = new NewsSMSFactory(); //實現新聞短信的發送
}
業務BLL層的方法;
發送新聞短信:
public class BussinessNews
{
public BussinessNews()
{
![]()
}
![]()
IMessage message = MessageUtility.news.Create();
![]()
public void send(object obj)
{
message.SendMessage(obj);
}
}
發送天氣預報短信:
public class BussinessWeather
{
![]()
public BussinessWeather()
{
![]()
}
![]()
IMessage message = MessageUtility.weather.Create();
![]()
public void send(object obj)
{
message.SendMessage(obj);
}
}
實現:
也可以不創建IDAL工廠模型來實現,可以使用反射技術來實現在SERVER層實現IDAL的接口,使用反射減少了很多代碼,但是程序的效率會有所下降。
反射介紹:Assembly類是在System.Reflection命名空間中定義的,他允許訪問給程序集的元數據,它也包含可以加載和執行程序集(假定該程序集是可執行的)的方法。與Type類一樣,Assembly類包含非常多的方法和屬性。在使用Assembly實例做一些工作前,需要把相應的程序集加載到運行過程中,為此,可以使用靜態成員Assembly.Load()或者Assembly.LoadFrom()。這兩個方法的區別是Load()參數是程序集的名稱,運行庫會在各個位置上搜索該程序集,這些位置包括本地目錄和全局程序集高速緩存。而LoadFrom()的參數是程序集的完整路徑名,不會在其他位置搜索該程序集。
反射代碼:
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
![]()
namespace ClassLibrary1
{
class Reflection
{
private static readonly string path = "ClassLibrary1";
private static object CreateObjectNoCache(string path, string CacheKey)
{
try
{
object objType = Assembly.Load(path).CreateInstance(CacheKey);
return objType;
}
catch
{
return null;
}
![]()
}
![]()
public static ClassLibrary1.IMessage CreateNews()
{
string CacheKey = path + ".NewsSMS";
object objType = CreateObjectNoCache(path, CacheKey);
return (ClassLibrary1.IMessage)objType;
}
![]()
public static ClassLibrary1.IMessage CreateWeather()
{
string CacheKey = path + ".WeatherSMS";
object objType = CreateObjectNoCache(path, CacheKey);
return (ClassLibrary1.IMessage)objType;
}
}
}
那么業務類BLL修改為:
發送新聞的業務類
public class BussinessNews
{
public BussinessNews()
{
![]()
}
![]()
private readonly IMessage message = Reflection.CreateNews();
public void send(object obj)
{
message.SendMessage(obj);
}
}
發送天氣預報的業務類
public class BussinessWeather
{
private readonly IMessage message = Reflection.CreateWeather();
public BussinessWeather()
{
![]()
}
![]()
public void send(object obj)
{
message.SendMessage(obj);
}
}
實現:
class Program
{
static void Main(string[] args)
{
BussinessNews bn = new BussinessNews();
bn.send("新聞短信發送成功!");
![]()
BussinessWeather bw = new BussinessWeather();
bw.send("天氣預報短信發送成功!");
}
}
———《設計模式》GoF
在接口IDAL層定義一個接口,該接口中方法表示發送不同短信消息。
//定義一個接口
public interface IMessage
void SendMessage(object Msg); //用于發送短信內容
}在SERVER層實現IDAL的接口,一個用來發送天氣預報短信,一個用來發送新聞短信。
public class WeatherSMS : IMessage
{
public void SendMessage(object msg)
{
Console.WriteLine("發送給定制天氣預報短信業務的客戶:{0};", msg);
}
}
public class NewsSMS : IMessage
{
public void SendMessage(object msg)
{
Console.WriteLine("發送給定制新聞短信業務的客戶:{0};", msg);
}
}創建IDAL的工廠:
public interface IMessageFactory
{
IMessage Create();
}
public class WeatherSMSFactory : IMessageFactory
{
public IMessage Create()
{
return new WeatherSMS();
}
}
public class NewsSMSFactory : IMessageFactory
{
public IMessage Create()
{
return new NewsSMS();
}
}實現DAL的工廠:
static class MessageUtility
{
public static IMessageFactory weather = new WeatherSMSFactory(); //實現天氣預報短信的發送
public static IMessageFactory news = new NewsSMSFactory(); //實現新聞短信的發送
}業務BLL層的方法;
發送新聞短信:
public class BussinessNews
{
public BussinessNews()
{
}
IMessage message = MessageUtility.news.Create();
public void send(object obj)
{
message.SendMessage(obj);
}
}
public class BussinessWeather
{
public BussinessWeather()
{
}
IMessage message = MessageUtility.weather.Create();
public void send(object obj)
{
message.SendMessage(obj);
}
}實現:
class Program
{
static void Main(string[] args)
{
BussinessNews bn = new BussinessNews();
bn.send("新聞短信發送成功!");
BussinessWeather bw = new BussinessWeather();
bw.send("天氣預報短信發送成功!");
}
}
{
static void Main(string[] args)
{
BussinessNews bn = new BussinessNews();
bn.send("新聞短信發送成功!");
BussinessWeather bw = new BussinessWeather();
bw.send("天氣預報短信發送成功!");
}
}
也可以不創建IDAL工廠模型來實現,可以使用反射技術來實現在SERVER層實現IDAL的接口,使用反射減少了很多代碼,但是程序的效率會有所下降。
反射介紹:Assembly類是在System.Reflection命名空間中定義的,他允許訪問給程序集的元數據,它也包含可以加載和執行程序集(假定該程序集是可執行的)的方法。與Type類一樣,Assembly類包含非常多的方法和屬性。在使用Assembly實例做一些工作前,需要把相應的程序集加載到運行過程中,為此,可以使用靜態成員Assembly.Load()或者Assembly.LoadFrom()。這兩個方法的區別是Load()參數是程序集的名稱,運行庫會在各個位置上搜索該程序集,這些位置包括本地目錄和全局程序集高速緩存。而LoadFrom()的參數是程序集的完整路徑名,不會在其他位置搜索該程序集。
反射代碼:
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
namespace ClassLibrary1
{
class Reflection
{
private static readonly string path = "ClassLibrary1";
private static object CreateObjectNoCache(string path, string CacheKey)
{
try
{
object objType = Assembly.Load(path).CreateInstance(CacheKey);
return objType;
}
catch
{
return null;
}
}
public static ClassLibrary1.IMessage CreateNews()
{
string CacheKey = path + ".NewsSMS";
object objType = CreateObjectNoCache(path, CacheKey);
return (ClassLibrary1.IMessage)objType;
}
public static ClassLibrary1.IMessage CreateWeather()
{
string CacheKey = path + ".WeatherSMS";
object objType = CreateObjectNoCache(path, CacheKey);
return (ClassLibrary1.IMessage)objType;
}
}
}
那么業務類BLL修改為:
發送新聞的業務類
public class BussinessNews
{
public BussinessNews()
{
}
private readonly IMessage message = Reflection.CreateNews();
public void send(object obj)
{
message.SendMessage(obj);
}
}
public class BussinessWeather
{
private readonly IMessage message = Reflection.CreateWeather();
public BussinessWeather()
{
}
public void send(object obj)
{
message.SendMessage(obj);
}
}實現:
class Program
{
static void Main(string[] args)
{
BussinessNews bn = new BussinessNews();
bn.send("新聞短信發送成功!");
BussinessWeather bw = new BussinessWeather();
bw.send("天氣預報短信發送成功!");
}
}


浙公網安備 33010602011771號