工厂方法模式(Factory Method Pattern)

介绍
定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。

示例
有SqlMessage和XmlMessage,用Factory Method来实例化它们。

  MessageModel

using System;
using System.Collections.Generic;
using System.Text; namespace Pattern.FactoryMethod
{
/// <summary>
/// Message实体类
/// </summary>
public class MessageModel
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="msg">Message内容</param>
/// <param name="pt">Message发布时间</param>
public MessageModel(string msg, DateTime pt)
{
this._message = msg;
this._publishTime = pt;
} private string _message;
/// <summary>
/// Message内容
/// </summary>
public string Message
{
get { return _message; }
set { _message = value; }
} private DateTime _publishTime;
/// <summary>
/// Message发布时间
/// </summary>
public DateTime PublishTime
{
get { return _publishTime; }
set { _publishTime = value; }
}
}
}

  AbstractMessage

using System;
using System.Collections.Generic;
using System.Text; namespace Pattern.FactoryMethod
{
/// <summary>
/// 操作Message抽象类(Product)
/// </summary>
public abstract class AbstractMessage
{
/// <summary>
/// 获取Message
/// </summary>
/// <returns></returns>
public abstract List<MessageModel> Get(); /// <summary>
/// 插入Message
/// </summary>
/// <param name="mm">Message实体对象</param>
/// <returns></returns>
public abstract bool Insert(MessageModel mm);
}
}

  SqlMessage

using System;
using System.Collections.Generic;
using System.Text; namespace Pattern.FactoryMethod
{
/// <summary>
/// Sql方式操作Message(ConcreteProduct)
/// </summary>
public class SqlMessage : AbstractMessage
{
/// <summary>
/// 获取Message
/// </summary>
/// <returns></returns>
public override List<MessageModel> Get()
{
List<MessageModel> l = new List<MessageModel>();
l.Add(new MessageModel("SQL方式获取Message", DateTime.Now)); return l;
} /// <summary>
/// 插入Message
/// </summary>
/// <param name="mm">Message实体对象</param>
/// <returns></returns>
public override bool Insert(MessageModel mm)
{
// 代码略
return true;
}
}
}

  XmlMessage

using System;
using System.Collections.Generic;
using System.Text; namespace Pattern.FactoryMethod
{
/// <summary>
/// Xml方式操作Message(ConcreteProduct)
/// </summary>
public class XmlMessage : AbstractMessage
{
/// <summary>
/// 获取Message
/// </summary>
/// <returns></returns>
public override List<MessageModel> Get()
{
List<MessageModel> l = new List<MessageModel>();
l.Add(new MessageModel("XML方式获取Message", DateTime.Now)); return l;
} /// <summary>
/// 插入Message
/// </summary>
/// <param name="mm">Message实体对象</param>
/// <returns></returns>
public override bool Insert(MessageModel mm)
{
// 代码略
return true;
}
}
}

  AbstractMessageFactory

using System;
using System.Collections.Generic;
using System.Text; namespace Pattern.FactoryMethod
{
/// <summary>
/// 抽象Message工厂(Creator)
/// </summary>
public abstract class AbstractMessageFactory
{
// An Operation /// <summary>
/// 工厂方法
/// </summary>
/// <returns>AbstractMessage</returns>
public abstract AbstractMessage CreateMessage();
}
}

  SqlMessageFactory

using System;
using System.Collections.Generic;
using System.Text; namespace Pattern.FactoryMethod
{
/// <summary>
/// SqlMessage工厂(ConcreteCreator)
/// </summary>
public class SqlMessageFactory : AbstractMessageFactory
{
/// <summary>
/// 实现工厂方法,返回SqlMessage对象
/// </summary>
/// <returns></returns>
public override AbstractMessage CreateMessage()
{
return new SqlMessage();
}
}
}

  XmlMessageFactory

using System;
using System.Collections.Generic;
using System.Text; namespace Pattern.FactoryMethod
{
/// <summary>
/// XmlMessage工厂(ConcreteCreator)
/// </summary>
public class XmlMessageFactory : AbstractMessageFactory
{
/// <summary>
/// 实现工厂方法,返回XmlMessage对象
/// </summary>
/// <returns></returns>
public override AbstractMessage CreateMessage()
{
return new XmlMessage();
}
}
}

  Client

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls; using Pattern.FactoryMethod; public partial class FactoryMethod : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
AbstractMessageFactory amf = new SqlMessageFactory();
AbstractMessage am = amf.CreateMessage(); Response.Write(am.Insert(new MessageModel("插入", DateTime.Now)));
Response.Write("<br />");
Response.Write(am.Get()[0].Message + " " + am.Get()[0].PublishTime.ToString());
Response.Write("<br />"); amf = new XmlMessageFactory();
am = amf.CreateMessage(); Response.Write(am.Insert(new MessageModel("插入", DateTime.Now)));
Response.Write("<br />");
Response.Write(am.Get()[0].Message + " " + am.Get()[0].PublishTime.ToString());
}
}

  运行结果
  True
  SQL方式获取Message 2007-5-4 22:34:39
  True
  XML方式获取Message 2007-5-4 22:34:39

二十四种设计模式:工厂方法模式(Factory Method Pattern)的更多相关文章

  1. 二十四种设计模式:模板方法模式(Template Method Pattern)

    模板方法模式(Template Method Pattern) 介绍定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.Template Method使得子类可以不改变一个算法的结构即可重定义该算法 ...

  2. C#设计模式——工厂方法模式(Factory Method Pattern)

    一.概述在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口.如何应对这种变化?如何提供一种封装机制来隔离出“这个易变对象 ...

  3. 【设计模式】工厂方法模式 Factory Method Pattern

    在简单工厂模式中产品的创建统一在工厂类的静态工厂方法中创建,体现了面形对象的封装性,客户程序不需要知道产品产生的细节,也体现了面向对象的单一职责原则(SRP),这样在产品很少的情况下使用起来还是很方便 ...

  4. 设计模式-03工厂方法模式(Factory Method Pattern)

    插曲.简单工厂模式(Simple Factory Pattern) 介绍工厂方法模式之前,先来做一个铺垫,了解一下简单工厂模式,它不属于 GoF 的 23 种经典设计模式,它的缺点是增加新产品时会违背 ...

  5. 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)

    原文:乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pa ...

  6. 设计模式之工厂方法模式(Factory Method Pattern)

    一.工厂方法模式的诞生 在读这篇文章之前,我先推荐大家读<设计模式之简单工厂模式(Simple Factory Pattern)>这篇文档.工厂方法模式是针对简单工厂模式中违反开闭原则的不 ...

  7. [设计模式]工厂方法模式(Factory Method)

    模式目的 定义一个用于创建对象的接口,让其子类来决定实例化哪个类. 工厂方法模式将类的实例化延迟到了子类中进行. 模式结构 组成部分 产品(Product) - 定义了产品功能的接口 具体产品(Con ...

  8. 【UE4 设计模式】工厂方法模式 Factory Method Pattern 及自定义创建资源

    概述 描述 又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式,或者多态工厂(Polymorphic Factory)模式 工厂父类负责定义创建产品对象的公共接口,而工厂子类 ...

  9. 大话设计模式--工厂方法模式 Factory Method -- C++实现

    1. 工厂方法模式 定义一个用于创建对象的接口, 让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 和简单工厂模式相比: A: 简单工厂模式最大的优点在于工厂类中包含有必要的逻辑判断, ...

随机推荐

  1. spring boot&&cloud干货系列

    接触spring boot也有些时日了,刚开始博主还想参照官方参考指南自己写一个系列的入门式的教程,包含spring boot的所有模块的用法,后来发现,有一大波优秀的系列文章和项目了,所以就没班门弄 ...

  2. 深度学习方法:受限玻尔兹曼机RBM(二)网络模型

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入 上解上一篇RBM(一)基本概念, ...

  3. Linux 基础——查看文件内容的命令

    第四天,继续学习.今天看到一句话,"你以为你以为的就是你以为的吗?",这句话还是有点意思啊!!! 一.查看文件内容的命令 file dest:查看文件的类型.在Linux中,文件的 ...

  4. 云联云通讯报错:应用与模板id不匹配,解决方法

    <statusMsg>应用与模板id不匹配</statusMsg> 这种一般是后端服务器上配置的APP ID和模板ID所属的APP不一致造成的 找到发送模板短信的方法,修改ap ...

  5. Java8之Stream/Map

    本篇用代码示例结合JDk源码讲了Java8引入的工具接口Stream以及新Map接口提供的常用默认方法.    参考:http://winterbe.com/posts/2014/03/16/java ...

  6. bzoj 4327 AC自动机

    思路:将能跑到的状态标记一下,在bfs搜一下就好啦. #include<bits/stdc++.h> #define LL long long #define ll long long # ...

  7. hdu 5576 dp

    题目大意:给你一个长度为 n 的 字符串表示一个乘法,一次操作随机选两个字符进行交换,进行m次操作,让你求出所有可能操作 的答案和.  (1 <= n, m <= 50) 思路:巨难.. ...

  8. ASP.NET MVC4+EF5(Lambda/Linq)读取数据

    希望大家记住,这里讲的所有的知识点,不仅仅是了解了就可以了,还要会灵活用,一定要多思考,撑握其中的编程思想. 本文讲的是委托和事件,这两个词可能你早就耳熟能详,但你是否真正撑握了呢? 本系列讲的C#高 ...

  9. Attacking JavaScript Engines: A case study of JavaScriptCore and CVE-2016-4622(转)

    转:http://phrack.org/papers/attacking_javascript_engines.html Title : Attacking JavaScript Engines: A ...

  10. WQS二分题集

    WQS二分,一种优化一类特殊DP的方法. 很多最优化问题都是形如“一堆物品,取与不取之间有限制.现在规定只取k个,最大/小化总收益”. 这类问题最自然的想法是:设f[i][j]表示前i个取j个的最大收 ...