• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

《模式——工程化实现及扩展》(设计模式C# 版)《工厂方法模式 Factory Method》—— ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
转自:《模式——工程化实现及扩展》(设计模式C# 版)
http://www.cnblogs.com/callwangxiang/

 

 

请修改本章最后完成的那个比较适于工程应用的工厂类型,使其支持含参数的构造函数

 

分析:

1、本着OCP原则,我们不对原有Factory<T> 进行修改,而是通过继承对其进行扩展

2、继续采用.NET Framework自带的Activator提供对于带参数构造函数的支持

3、为了与原有Factory<T>的方法签名作区别,我们在新的接口中要求只有明确声明为object[]的数组才作为构造函数参数

 

参考答案

 

1、为了不引起其歧义,首先修改引用的命名空间

using System;
using = MarvellousWorks.PracticalPattern.FactoryMethod;
using Microsoft.VisualStudio.TestTools.UnitTesting;

 

 2、定义新的工厂接口和具体工厂类型

interface IFactory : F.IFactory    
{
#region factory method
    TTarget Create
<TTarget>(object[] parametes);
    TTarget Create
<TTarget>(string name, object[] parametes);
    
#endregion
}
        
class Factory : F.Factory, IFactory     
{
    public TTarget Create<TTarget>(object[] parametes)
    {
        
return (TTarget)Activator.CreateInstance(registry[typeof(TTarget)], parametes);
    }

    
public TTarget Create<TTarget>(string name, object[] parametes)        
    {
        return (TTarget)Activator.CreateInstance(registry[typeof(TTarget), name], parametes);
    }
}

 

3、编写单元测试验证

[TestMethod]
public void CreateInstance()
{
    var factory 
= new Factory()
        .RegisterType
<IFruit, Apple>()
        .RegisterType
<IFruit, Orange>("o")
        .RegisterType
<IVehicle, Bicycle>()
        .RegisterType
<IVehicle, Bicycle>("a")
        .RegisterType
<IVehicle, Train>("b")
        .RegisterType
<IVehicle, Car>("c")
        .RegisterType
<IEntry, EntryWithName>()
        .RegisterType
<IEntry, EntryWithName>("n")
        .RegisterType
<IEntry, EntryWithNameAndAgeAndTitle>("nat");

    
#region 构造函数无参数的类型

    Assert.IsInstanceOfType(factory.Create
<IFruit>(), typeof(Apple));
    Assert.IsInstanceOfType(factory.Create
<IFruit>("o"), typeof(Orange));

    Assert.IsInstanceOfType(factory.Create
<IVehicle>(), typeof(Bicycle));
    Assert.IsInstanceOfType(factory.Create
<IVehicle>("a"), typeof(Bicycle));
    Assert.IsInstanceOfType(factory.Create
<IVehicle>("b"), typeof(Train));
    Assert.IsInstanceOfType(factory.Create
<IVehicle>("c"), typeof(Car));

    
#endregion

    
#region 构造函数带参数的类型

    //  转换为新的扩展接口形式
    var f = (IFactory) factory;    

    //  使用扩展的功能
    var e1 = f.Create<IEntry>(new object[] { "joe" });
    Assert.IsInstanceOfType(e1, 
typeof(EntryWithName));
    Assert.AreEqual
<string>("joe", ((EntryWithName) e1).Name);

 
   var e2 = f.Create<IEntry>("nat"new object[] { "joe"20});
    Assert.IsInstanceOfType(e2, 
typeof(EntryWithNameAndAgeAndTitle));
    Assert.AreEqual
<string>("joe", ((EntryWithName)e2).Name);
    Assert.AreEqual
<int>(20, ((EntryWithNameAndAgeAndTitle)e2).Age);
    Assert.AreEqual
<string>(EntryWithNameAndAgeAndTitle.DefaultTitle, ((EntryWithNameAndAgeAndTitle)e2).Title);

    
#endregion
}

 

 

 

 

 

 

 

 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap