Factory Method 工厂方法模式(创建型模式)

 在接口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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/16436858/viewspace-612310/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值