Factory Method 工廠方法模式(建立型模式)

iSQlServer發表於2009-08-14
 在介面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(
"天氣預報簡訊傳送成功!");
        }
    }

也可以不建立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(
"天氣預報簡訊傳送成功!");
        }

    }

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-612310/,如需轉載,請註明出處,否則將追究法律責任。

相關文章