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);
        }

    }

     实现:
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(
"天气预报短信发送成功!");
        }

    }


     
posted @ 2008-02-29 17:06  love .net FrameWork  阅读(1947)  评论(2编辑  收藏  举报