Factory Method 工厂方法模式(创建型模式)
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例话延迟到子类。
———《设计模式》GoF
在接口IDAL层定义一个接口,该接口中方法表示发送不同短信消息。
在SERVER层实现IDAL的接口,一个用来发送天气预报短信,一个用来发送新闻短信。
创建IDAL的工厂:
实现DAL的工厂:
业务BLL层的方法;
发送新闻短信:
实现:
也可以不创建IDAL工厂模型来实现,可以使用反射技术来实现在SERVER层实现IDAL的接口,使用反射减少了很多代码,但是程序的效率会有所下降。
反射介绍:Assembly类是在System.Reflection命名空间中定义的,他允许访问给程序集的元数据,它也包含可以加载和执行程序集(假定该程序集是可执行的)的方法。与Type类一样,Assembly类包含非常多的方法和属性。在使用Assembly实例做一些工作前,需要把相应的程序集加载到运行过程中,为此,可以使用静态成员Assembly.Load()或者Assembly.LoadFrom()。这两个方法的区别是Load()参数是程序集的名称,运行库会在各个位置上搜索该程序集,这些位置包括本地目录和全局程序集高速缓存。而LoadFrom()的参数是程序集的完整路径名,不会在其他位置搜索该程序集。
反射代码:
那么业务类BLL修改为:
发送新闻的业务类
实现:
———《设计模式》GoF
在接口IDAL层定义一个接口,该接口中方法表示发送不同短信消息。
//定义一个接口
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("天气预报短信发送成功!");
}
}