简单工厂模式—>工厂模式
一、功能
根据前一篇博客:策略模式+单例模式+简单工厂模式:推送服务,想试用一下工厂模式:将之前的简单工厂模式格式化为工厂模式。
二、实现
修改前:简单工厂
public static class PushServiceFactory
{
public static IPush Creat(PushType type)
{
IPush pushService = null;
switch (type)
{
case PushType.QQ: pushService = QQ.GetInstance(); break;
case PushType.Email: pushService = new Email(); break;
default:throw new ArgumentOutOfRangeException();
}
return pushService;
}
}
public void ExcutePush(object data, List<PushType> types)
{
Console.WriteLine("推送数据");
foreach (PushType type in types)
{
IPush pushService = PushServiceFactory.Creat(type);
pushService.Push(data);
}
}
修改后:工厂模式(象征性的都写在一个文件里面)
interface Factory
{
IPush Creat();
} public class QQFactory : Factory
{
public IPush Creat()
{
return QQ.GetInstance();
}
}
public class EmailFactory : Factory
{
public IPush Creat()
{
return new Email();
} }
interface Factory
{
IPush Creat();
} public class QQFactory:Factory
{
public IPush Creat()
{
return QQ.GetInstance();
}
}
public class EmailFactory : Factory
{
public IPush Creat()
{
return new Email();
} }
3、调用(这里有个前提:我不知道客户端是勾选了QQ推送还是Email推送)
所以在这里的调用,又回到了简单工厂模式,用简单工厂模式通过传参数,选择启用的推送工厂,进而实例具体的推送。
所以我觉得,简单工厂虽然有强耦合,但是我可以在不知道客户端需要调用谁的情况下,根据参数来实例化具体的类。
工厂模式,是我知道客户端明确的调用那个工厂来创建。
之前:简单工厂的调用
public void ExcutePush(object data, List<PushType> types)
{
Console.WriteLine("推送数据");
foreach (PushType type in types)
{
IPush pushService = PushServiceFactory.Creat(type);
pushService.Push(data);
}
}
现在:工厂模式调用
public void ExcutePush(object data, List<PushType> types)
{
Console.WriteLine("推送数据");
foreach (PushType type in types)
{
Factory factory = null;
switch (type)
{
case PushType.QQ: factory = new QQFactory(); break;
case PushType.Email: factory = new EmailFactory(); break;
default: throw new ArgumentOutOfRangeException();
}
IPush pushService = factory.Creat();
pushService.Push(data);
}
}
4、总结
合适的才是最好的。
简单工厂模式—>工厂模式的更多相关文章
- Java设计模式之工厂模式(简单工厂模式+工厂方法模式)
摘自http://blog.csdn.net/jason0539/article/details/23020989 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是 ...
- Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)
工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...
- Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式
工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...
- [C#]设计模式-简单工厂-创建型模式
在设计模式当中有三大工厂,分别是 简单工厂.抽象工厂.工厂方法 这三种创建实例的设计模式,这里先从简单工厂将其,从名字就可以看出这是这三种工厂模式当中最为简单的一种实现. 简单工厂一般由以下几个对象组 ...
- C#设计模式之5:简单工厂和工厂方法模式
工厂模式包含三种,简单工厂模式,工厂方法模式,抽象工厂模式.这三种都是解决了一个问题,那就是对象的创建问题.他们的职责就是将对象的创建和对象的使用分离开来. 当我们创建对象的时候,总是会new一个对象 ...
- 设计模式(Python)-简单工厂,工厂方法和抽象工厂模式
本系列文章是希望将软件项目中最常见的设计模式用通俗易懂的语言来讲解清楚,并通过Python来实现,每个设计模式都是围绕如下三个问题: 为什么?即为什么要使用这个设计模式,在使用这个模式之前存在什么样的 ...
- 简单工厂模式&策略模式-简介与区别
不得不说,这两种模式真的很像. 相似点:都用到了面向对象的继承.多态.抽象,都拥有相似的结构. 不同点:工厂模式仅提供具体的实例对象,怎么使用这个对象是client的自由,策略模式client可以通过 ...
- 设计模式3---工厂模式(Factory Pattern简单工厂、工厂方法、抽象工厂)
工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...
- windows服务 MVC之@Html.Raw()用法 文件流的读写 简单工厂和工厂模式对比
windows服务 public partial class Service1 : ServiceBase{ System.Threading.Timer recordTimer;public S ...
- C#设计模式学习笔记:简单工厂模式(工厂方法模式前奏篇)
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7551373.html,记录一下学习过程以备后续查用. 一.引言 简单工厂模式并不属于GoF23里面的设计模式 ...
随机推荐
- windows phone 7 定位(获取经纬度),然后找到经纬度所在的位置(城市信息)
原文:windows phone 7 定位(获取经纬度),然后找到经纬度所在的位置(城市信息) 前几天做项目用到, 代码贴给大家. /// <summary> /// 获取当前位置的经纬度 ...
- POJ 1146:ID Codes
ID Codes Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6281 Accepted: 3769 Description ...
- jQuery回到顶部插件jQuery GoUp
插件描写叙述 jQuery GoUp!是一个简单的jQuery插件,让你的网页用户直接回到顶部. 用法很easy 引用jquery库和jquery.goup.min.js到你的页面 <scrip ...
- 工程PMO工作
算起来,这是第一次以项目PMO人员的身份參与项目.尽管非常可惜没有从头參与,也没有參与到项目结束.仅仅有短短的两个月,但对项目PMO也可略窥一斑.如今就当个流水账写一写吧. 进项目组的时候,是中 ...
- UVa 11463 - Commandos
主题:有一个敢死队,要销毁的建筑群,他们从一个特定建筑物离开,最后到一组特定的建筑物的. 现在,各个建筑物之间进行连接的路由,班车需要在建筑物1时间单位,我问的第一次集合. 分析:图论,最短路径.直接 ...
- Android进程间通信(IPC)机制Binder简介和学习计划
在Android系统,每个应用程序是由多个Activity和Service部件,这些Activity和Service有可能在相同的处理被执行,此外,还可以在不同的过程中进行. 然后.不是在同一个过程A ...
- SQL注入的原理解说,挺好!
原文地址:http://www.cnblogs.com/rush/archive/2011/12/31/2309203.html 1.1.1 总结 前几天,国内最大的程序猿社区CSDN网站的用户数据库 ...
- fedora linux平台下搭建lighttpd+php+sqlite
(一)lighttpd 1. 安装 yum install lighttpd 安装完毕后,系统中应该多了一个用户lighttpd和组lighttpd.这个用户,默认是不同意登陆的. 我们改动/etc/ ...
- window忘记密码怎么办
net命令 Net User 功能:添加或更改用户帐号或显示用户帐号信息. 格式:net user [username [password | *] [options]] [/domain] ne ...
- URAL 1725. Sold Out!(数学啊 )
题目链接:space=1&num=1725" target="_blank">http://acm.timus.ru/problem.aspx?space= ...