1、简介

泛型工厂理论上不算Gof23中设计模式之一,但是也算是一种非常好的设计模式,个人认为,废话不多说,先写个简单的抽象工厂,在写一个泛型工厂的例子来比较抽象和泛型的区别.

2、实战

还是房屋和道路,always road and house,例子不重要重要的是对模式的理解.

3、抽象工厂

    public class Program
{
public static void Main(string[] args)
{
var build = new BuildSystem(new ModernFactory());
build.Build();
Console.ReadKey();
}
} /// <summary>
/// 抽象道路
/// </summary>
public abstract class Road
{
/// <summary>
/// 该抽象方法,没有实际意义,只为演示效果
/// </summary>
/// <returns></returns>
public abstract string ShowMessage();
} /// <summary>
/// 现代化道路
/// </summary>
public class ModernRoad : Road
{
public override string ShowMessage()
{
return "I am Modern Road";
}
} /// <summary>
/// 抽象房屋
/// </summary>
public abstract class House
{
/// <summary>
/// 该抽象方法,没有实际意义,只为演示效果
/// </summary>
/// <returns></returns>
public abstract string ShowMessage();
} /// <summary>
/// 现代化房屋
/// </summary>
public class ModernHouse : House
{
public override string ShowMessage()
{
return "I am Modern House";
}
} /// <summary>
/// 前面的随笔中说过,抽象工厂是为了解决系列抽象对象的创建,所以里面会有>1个抽象对象的创建方法
/// </summary>
public abstract class AbstractFactory
{
public abstract Road CreateRoad(); public abstract House CreateHouse();
} /// <summary>
/// 现代化房屋和道路的创建工厂
/// </summary>
public class ModernFactory : AbstractFactory
{
public override House CreateHouse()
{
return new ModernHouse();
} public override Road CreateRoad()
{
return new ModernRoad();
}
} /// <summary>
/// 构建系统
/// </summary>
public class BuildSystem
{
private AbstractFactory _abstractFactory;
public BuildSystem(AbstractFactory abstractFactory)
{
_abstractFactory = abstractFactory;
} public void Build()
{
var house=_abstractFactory.CreateHouse();
var road=_abstractFactory.CreateRoad();
Console.WriteLine($"{house.ShowMessage()},现已被创建");
Console.WriteLine($"{road.ShowMessage()},现已被创建");
}
}

ok,简单的通过抽象工厂解决了现代化风格房屋的创建,且BuildSystem并没有依赖具体的现代化房屋和道路的实现,他依赖的是抽象,且如果这个时候需要其他风格的房屋和道路的创建,只需要通过扩展的方式依次添加抽线和具体的实现来完成需求.这里就不实现了,自行参考前面的随笔.

2、泛型工厂

下面来通过泛型工厂来实现上面的案例

    public class Program
{
public static void Main(string[] args)
{
new BuildSystem().Build();
Console.ReadKey();
}
} public abstract class Road
{
public abstract string ShowMessage();
} public class ModernRoad : Road
{
public override string ShowMessage()
{
return "I am Modern Road";
}
} public class Factory<T> where T : class
{
public static T Get()
{
return _create.Create();
} static ICreator _create;
interface ICreator
{
T Create();
} class Creator<TChild> : ICreator where TChild:T,new()
{
public T Create()
{
return new TChild();
}
} class SingletonCreator<TChild> : ICreator where TChild : T, new()
{
/// <summary>
/// 初始化TChild的时候会调用static构造函数,所以线程安全.
/// </summary>
static readonly T Instance = new TChild();
public T Create()
{
//这里单例可以使用双检锁创建单例对象,也可以使用"内联初始化"来创建单例对象
return Instance;
}
} /// <summary>
/// 支持继承关系的Set方法
/// </summary>
/// <typeparam name="TChild"></typeparam>
public static void Set<TChild>() where TChild:T,new()
{
_create = new Creator<TChild>();
} /// <summary>
/// 支持单例同时支持继承的Set方法
/// </summary>
/// <typeparam name="TChild"></typeparam>
public static void SetSingleton<TChild>() where TChild : T, new()
{
_create = new SingletonCreator<TChild>();
}
} /// <summary>
/// 构建系统
/// </summary>
public class BuildSystem
{ public void Build()
{
//注册ModernRoad对象,Transiant模式
Factory<Road>.Set<ModernRoad>();
var r1=Factory<Road>.Get().GetHashCode();
var r2= Factory<Road>.Get().GetHashCode();
Console.WriteLine("r1和r2引用" + (ReferenceEquals(r1, r2) ? "相等" : "不相等")); //注册ModernRoad对象,单例模式
Factory<Road>.SetSingleton<ModernRoad>();
var s1 = Factory<Road>.Get();
var s2 = Factory<Road>.Get();
Console.WriteLine("s1和s2引用"+(ReferenceEquals(s1, s2)?"相等":"不相等"));
} }

上面使用泛型工厂配合C#其他一些特性完成了一个简单版的IOC容器的功能.所以在设计一些模块的时候也可以考虑将泛型工厂作为创建型模式的一种选择方案.

当然你也可以进一步的扩展,通过一个字典类,来完成配置文件的方式,来动态的完成对象的注入,这里就不演示,自行实现.

GenericFactoryMethod泛型工厂模式实现简单IOC功能的更多相关文章

  1. Java学习笔记——Java工厂模式之简单工厂

    package com.app; import java.util.Date; /* * 工厂模式:简单工厂.工厂方法.抽象工厂 * * */ public class Test0718_Factor ...

  2. Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式

    工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...

  3. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---工厂模式之简单工厂

    简单工厂:工厂依据传进的参数创建相应的产品. http://www.cnblogs.com/DelphiDesignPatterns/archive/2009/07/24/1530536.html { ...

  4. Objective-C 工厂模式(上) -- 简单工厂模式

    简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂 ...

  5. Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)

    工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...

  6. 使用工厂模式解耦和IoC思想

    使用工厂模式解耦. 一.需求场景: 某一层功能需要改动,但其他层代码不变 实现类1:MyDaoImpl查询自己的数据库. ====改为====> 实现类2:MyDaoImpl2从其它地址得到数据 ...

  7. 【LabVIEW技巧】工厂模式_简单工厂

    前言 上一个文章介绍了如何学习LabVIEW OOP,简要的提及了一些OOP学习中注意的事项,许多文章的读者反映写的太范,后文会逐步缩小范围,讨论在LabVIEW中各个模式的应用. 工厂模式概述 工厂 ...

  8. javascript设计模式-工厂模式(简单工厂)

    接口在工厂模式中起着很重要的作用,如果不对对象进行某种类型检查的以确保其实现了必要的方法,工厂模式的好处也就所剩无几了,举个简单的例子. Interface.js // Constructor. va ...

  9. 工厂模式vs简单工厂

    前言 工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断 ...

随机推荐

  1. 常用JSON接口

    地图接口阿里云根据地区名获取经纬度接口http://gc.ditu.aliyun.com/geocoding?a=苏州市 官方文档参数解释: 纬度,经度 type 001 (100代表道路,010代表 ...

  2. Xshell连接不上阿里云服务器

    心血来潮买了一台1核2g内存,外加40g系统盘的阿里云ecs服务器,在配置xshell连接服务器一直无法连接,试了很多种方法,各种心累,不过最后还是找到了原因,是因为在服务器上没有配置安全组规则,附上 ...

  3. ORA-01017 invalid username/password;logon denied

    一般来说这个是密码丢失问题,但也许是因为你的用户名或密码写错啦,所以先检查下用户名和密码,觉得没错的话就去查看 sqlnet.ora (在 安装盘下面的:oracle\product\11.2.0\d ...

  4. python 基础 ------字符串的调用详解(1)

    Python 字符串的的调用方法~~~ 废话不多说直接奔主题 >>>>>>>>>>>>>>>>> ...

  5. 用idea部署maven-web项目

    项目部署时,需要加一步: 我们需要添加一个archetypeCatalog=internal.这个参数的意义是让这个maven项目的骨架不要到远程下载而是本地获取.如果你没加这个参数,那么项目创建可能 ...

  6. 学以致用三十六-----弄懂python装饰器

    看了海峰老师讲解的装饰器视频,讲解的非常棒.根据视频,记录笔记如下: 装饰器: 1.本质是函数,用def来定义.功能就是用来(装饰)其他函数,为其他函数添加附加功能 现有两个函数如下, def tes ...

  7. 数据库 的几种链接 join

    直接demo,懒的同学可以看看效果 两个表的数据 join和inner join一样 full join报错,可有大神知道原因?

  8. linux vsftp 简单配置

    查看自己是否安装vsftp rpm -qa | grep vsftp rpm -qa 查看自己已安装的包 过滤vsftp systemctl rsetart vsftpd 重启服务 先关闭防火墙 sy ...

  9. Django积木块九——富文本编辑器

    富文本编辑器 前端和后端都可以用富文本编辑器 # pip install django-tinymce # setting 'tinymce' TINYMCE_DEFAULT_CONFIG = { ' ...

  10. jquery1.6中的.prop()和.attr()异同

    jquery jQueryHTML5JavaScript浏览器ITeye  最近在iteye的新闻中看到jQuery已经更新到了1.6.1.和之前版本的最大变化是增加了.prop方法.但是.prop( ...