Factory Method 工廠方法模式(建立型模式)
在介面IDAL層定義一個介面,該介面中方法表示傳送不同簡訊訊息。
在SERVER層實現IDAL的介面,一個用來傳送天氣預報簡訊,一個用來傳送新聞簡訊。
建立IDAL的工廠:
實現DAL的工廠:
業務BLL層的方法;
傳送新聞簡訊:
實現:
也可以不建立IDAL工廠模型來實現,可以使用反射技術來實現在SERVER層實現IDAL的介面,使用反射減少了很多程式碼,但是程式的效率會有所下降。
反射介紹:Assembly類是在System.Reflection名稱空間中定義的,他允許訪問給程式集的後設資料,它也包含可以載入和執行程式集(假定該程式集是可執行的)的方法。與Type類一樣,Assembly類包含非常多的方法和屬性。在使用Assembly例項做一些工作前,需要把相應的程式集載入到執行過程中,為此,可以使用靜態成員Assembly.Load()或者Assembly.LoadFrom()。這兩個方法的區別是Load()引數是程式集的名稱,執行庫會在各個位置上搜尋該程式集,這些位置包括本地目錄和全域性程式集快取記憶體。而LoadFrom()的引數是程式集的完整路徑名,不會在其他位置搜尋該程式集。
反射程式碼:
那麼業務類BLL修改為:
傳送新聞的業務類
實現:
//定義一個介面
public interface IMessage
{
void SendMessage(object Msg); //用於傳送簡訊內容
}
public interface IMessage
{
void SendMessage(object Msg); //用於傳送簡訊內容
}
在SERVER層實現IDAL的介面,一個用來傳送天氣預報簡訊,一個用來傳送新聞簡訊。
public class WeatherSMS : IMessage
{
public void SendMessage(object msg)
{
Console.WriteLine("傳送給定製天氣預報簡訊業務的客戶:{0};", msg);
}
}
{
public void SendMessage(object msg)
{
Console.WriteLine("傳送給定製天氣預報簡訊業務的客戶:{0};", msg);
}
}
public class NewsSMS : IMessage
{
public void SendMessage(object msg)
{
Console.WriteLine("傳送給定製新聞簡訊業務的客戶:{0};", msg);
}
}
{
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();
}
}
{
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(); //實現新聞簡訊的傳送
}
{
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 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);
}
}
{
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;
}
}
}
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 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);
}
}
{
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("天氣預報簡訊傳送成功!");
}
}
{
static void Main(string[] args)
{
BussinessNews bn = new BussinessNews();
bn.send("新聞簡訊傳送成功!");
BussinessWeather bw = new BussinessWeather();
bw.send("天氣預報簡訊傳送成功!");
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-612310/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 設計模式--工廠方法模式(Factory Method Pattern)設計模式
- 設計模式之工廠方法模式(FACTORY METHOD)設計模式
- 設計模式--工廠模式Factory(建立型)設計模式
- 設計模式(Design Patterns)工廠方法模式(Factory Method)設計模式
- C#設計模式系列:工廠方法模式(Factory Method)C#設計模式
- JAVA設計模式之 工廠方法模式【Factory Method Pattern】Java設計模式
- 設計模式的征途—3.工廠方法(Factory Method)模式設計模式
- 建立型:工廠模式-工廠方法、抽象工廠模式抽象
- 設計模式-建立型-工廠方法設計模式
- 我所理解的設計模式(C++實現)——工廠方法模式(Factory Method Pattern)設計模式C++
- 使用C# (.NET Core) 實現簡單工廠(Simple Factory) 和工廠方法設計模式 (Factory Method Pattern)C#設計模式
- Abstract Factory(抽象工廠)——物件建立型模式抽象物件模式
- 建立型模式————工廠方法模式模式
- 建立型:工廠模式-簡單工廠模式
- 建立型設計模式——抽象工廠模式設計模式抽象
- 建立型模式:工廠方法模式
- 《設計模式》 - 2. 工廠模式( Factory )設計模式
- Java設計模式之工廠模式(Factory)Java設計模式
- JAVA設計模式 3【建立型】理解工廠模式與抽象工廠模式Java設計模式抽象
- C++設計模式建立型工廠模式C++設計模式
- python--設計模式--4--建立型--工廠方法模式Python設計模式
- 設計模式--抽象工廠模式(Abstract Factory Pattern)設計模式抽象
- Scala 與設計模式(四):Factory 工廠模式設計模式
- 設計模式-抽象工廠模式(Abstract Factory Pattern)設計模式抽象
- 工廠方法模式GoF23種設計模式之建立型模式之工廠方法模式Go設計模式
- 簡單工廠模式(Simple Factory Pattern)模式
- 簡單工廠模式( Simple Factory Pattern )模式
- 設計模式-工廠模式二(工廠方法模式)設計模式
- 設計模式-簡單工廠、工廠方法模式、抽象工廠模式設計模式抽象
- 建立模式 01-工廠模式模式
- 建立型模式——抽象工廠模式模式抽象
- 設計模式之工廠方法模式|抽象工廠模式設計模式抽象
- 設計模式之工廠模式!深入解析簡單工廠模式,工廠方法模式和抽象工廠模式設計模式抽象
- 設計模式系列之工廠模式三兄弟(Factory Pattern)設計模式
- 設計模式實戰 – 抽象工廠模式(Abstract Factory Pattern)設計模式抽象
- 設計模式實戰 - 抽象工廠模式(Abstract Factory Pattern)設計模式抽象
- JAVA設計模式之 抽象工廠模式【Abstract Factory Pattern】Java設計模式抽象
- 設計模式筆記:簡單工廠模式(Simple Factory)設計模式筆記