设计模式C#实现(九)——工厂方法模式和简单工厂
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
构成:
1.Product工厂方法创建的对象的接口
2.ConcreteProduct具体的产品,实现Product接口
3.Creator声明工厂方法,返回Product
4.ConcreteCreator实现/重写Creator的工厂方法,返回ConcreteProduct实例
UML类图:

实现
要生产的产品都实现一个接口
interface Product
{
string getName();
}
具体产品实现
class Phone : Product
{
private string name = "MyPhone";
public string getName()
{
return name;
}
}
工厂接口
interface Creator
{
Product createProduct();
}
具体工厂
class PhoneCreator : Creator
{
public Product createProduct()
{
return new Phone();
}
}
使用
class Program
{
static void Main(string[] args)
{
Creator creator = new PhoneCreator();
Product phone= creator.createProduct();
Console.WriteLine(phone.getName());
Console.ReadKey();
}
}
效果:
1.客户仅需处理Product接口,而不用知道它的具体实现是什么,符合针对接口编程的OO原则
2.要创建一个ConcreteProduct,就不得不创建一个ConcreteCreator
简单工厂:提供一个类,由它负责根据一定的条件创建某一具体类的实例,简单工厂不是一个设计模式(GOF没提,《HeadFirst设计模式》说像一种编程习惯)
UML类图:

构成:
1.SimpleFactory简单工厂,根据条件(参数)创建并返回一个实例
2. Product产品接口
3.ConcreteProduct具体产品,实现Product接口
以生产披萨为例,因为Pizza有许多不同口味,SimpleFactory根据客户的口味生产不同Pizza
class SimpleFactory
{
public Pizza getPizza(string type)
{
switch (type.Trim().ToLower())
{
case "cheesepizza":
return new CheesePizaa();
break;
case "clampizza":
return new ClamPizza();
break;
default:
return new NormalPizza();
break;
}
} }
Pizza接口
abstract class Pizza
{
virtual public string getName()
{
return "NormalPizza";
}
}
不同口味的Pizza
class CheesePizaa : Pizza
{
override public string getName()
{
return "CheesePizaa";
}
}
class ClamPizza : Pizza
{
override public string getName()
{
return "ClamPizza";
}
}
class NormalPizza:Pizza
{ }
客户选择可以提供条件来获得不同的实例
class Program
{
static void Main(string[] args)
{
SimpleFactory factory = new SimpleFactory();
Pizza cheesePiz = factory.getPizza("CheesePizza");
Pizza clamPiz = factory.getPizza("ClamPizza");
Pizza NormalPiz = factory.getPizza("");
Console.WriteLine(cheesePiz.getName());
Console.WriteLine(clamPiz.getName());
Console.WriteLine(NormalPiz.getName());
Console.ReadKey();
}
}
效果:
1.客户不再控制实例的创建,只需要使用,减少了客户的责任(单一责任原则?)
2.多个客户可以使用一个工厂,实现了代码复用
3.当实例的创建方法改变,并不影响客户(封装变化?)
4.当要添加产品就必须修改工厂,工厂方法模式一定程度上弥补了这个缺陷
设计模式C#实现(九)——工厂方法模式和简单工厂的更多相关文章
- 设计模式之工厂方法模式VS简单工厂方法模式
名词解释: 简单工厂:这个实在是没什么解释的,就是一个工厂类,然后有一个方法,根据传递的参数可以通过switch(你也可以是if,或者是使用高端的反射 )来进行对象的创建. 工厂方法:定义一个用于创建 ...
- Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)
Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...
- iOS常用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)
1. 简单工厂模式 如何理解简单工厂,工厂方法, 抽象工厂三种设计模式? 简单工厂方法包含:父类拥有共同基础接口,具体子类实现子类特殊功能,工厂类根据参数区分创建不同子类实例.该场景对应的UML图如下 ...
- iOS经常使用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)
1. 简单工厂模式 怎样理解简单工厂,工厂方法. 抽象工厂三种设计模式? 简单工厂的生活场景.卖早点的小摊贩.他给你提供包子,馒头,地沟油烙的煎饼等,小贩是一个工厂.它生产包子,馒头,地沟油烙的煎饼. ...
- python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)
十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...
- PHP简单工厂模式、工厂方法模式和抽象工厂模式比较
PHP工厂模式概念:工厂模式是一种类,它具有为您创建对象的某些方法.您可以使用工厂类创建对象,而不直接使用 new.这样,如果您想要更改所创建的对象类型,只需更改该工厂即可.使用该工厂的所有代码会自动 ...
- PHP简单工厂模式、工厂方法模式和抽象工厂模式
PHP工厂模式概念:工厂模式是一种类,它具有为您创建对象的某些方法.您可以使用工厂类创建对象,而不直接使用 new.这样,如果您想要更改所创建的对象类型,只需更改该工厂即可.使用该工厂的所有代码会自动 ...
- JAVA中的工厂方法模式和抽象工厂模式
工厂方法模式: 定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类.类型:创建类模式类图: 类图知识点:1.类图分为三部分,依次是类名.属性.方法2.以& ...
- 【design pattern】工厂方法模式和抽象工厂模式
前言 设计模式分为三大类: 创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式: 结构型模式:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式: 行为型模式 ...
随机推荐
- 关于重装系统与Visual Studio 2015
开始入坑 ... 9.25左右,由于本人电脑上同时安装了社区版vs2013与社区版vs2015,.无奈天公不作美,vs2015我每次一点击右上角的“登录”,马上就白屏,并弹窗提示,停止运行(忘了截屏 ...
- C#开发中可能会用到的一些小贴士(转)
转至http://www.cnblogs.com/Ebony-Ivory/p/4380106.html C#篇: 1.目标平台的选择 64位操作系统在编译VS里的程序时,根据需要设置项目属性的“目标平 ...
- 数据库sqlserver2008登陆名密码登陆不了怎么办?
我用的是sql server2008数据库,原先创建的登录名是sa,但是密码就忘了.总是出现这个连接问题
- 重新想象 Windows 8.1 Store Apps (77) - 控件增强: 文本类控件的增强, 部分控件增加了 Header 属性和 HeaderTemplate 属性, 部分控件增加了 PlaceholderText 属性
[源码下载] 重新想象 Windows 8.1 Store Apps (77) - 控件增强: 文本类控件的增强, 部分控件增加了 Header 属性和 HeaderTemplate 属性, 部分控件 ...
- ViewPager和Fragment的组合使用
如图是效果图用的是Viewpager和fragment来实现的主界面 不过其中的预加载我没有解决 如下是代码代码比较简单 package com.ithello.dingding; import ja ...
- 最全面的jdbcUtils,总有一种适合你
附加jar包,TxQueryRunner.java文件,dbconfig.properties配置文件(点击链接下载): http://files.cnblogs.com/files/xiaoming ...
- pygame for python3.3
pygame的更新慢的令人发指,我最初使用的python是3.4版本的,无何奈何pygame不支持3.4,甚至官网只有3.2版本的.我于是将各种版本试了一遍,出现各种问题,同时我比较钟爱3.x版本,最 ...
- 设置让ASP.NET管道接收所有类型的请求
在web.config文件添加如下一段配置: <configuration> <system.webServer> <modules runAllManagedModul ...
- 初识 easyui datagrid
首先应该下载好easyui datagrid所用的各种js 和css 这个可以到官网上去下载. 首先要引入datagrid所引入的js和css. <script src="js/jqu ...
- ubuntu vps 安装java
Introduction Java is a programming technology originally developed by Sun Microsystems and later acq ...