设计模式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】工厂方法模式和抽象工厂模式
前言 设计模式分为三大类: 创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式: 结构型模式:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式: 行为型模式 ...
随机推荐
- [JS] jQuery选择器
jQuery 选择器 选择器 实例 选取 * $("*") 所有元素 #id $("#lastname") id=lastname 的元素 .class $(& ...
- Sprint第三个冲刺(第七天)
项目基本上可以说完成了,只是还有些小bug要修复.
- Sprint第三个冲刺(第三天)
一.Sprint介绍 任务进度: 二.Sprint周期 看板: 燃尽图:
- 【EF 译文系列】韧性连接、重试(EF 版本至少为 6)
原文链接:Connection Resiliency / Retry Logic (EF6 onwards) 一个应用程序的数据库连接,是非常容易受其它因素影响的,比如后端的异常或者不稳定的网络连接等 ...
- sql联合查询去除重复计算总和
1.首先来个联合查询 SELECT 字段1, 字段2, 字段3, 字段4 FROM 表1 INNER JOIN 表2 ON 表1.字段x = 表2.字段x x:代表随意的一个,只要在联合查询的两张表都 ...
- 用linux遇到的一个死循环
1. 公司的服务器centos,需要通过vpn拨上去: 2. 然后ftp启用了tls加密: 3. 然后ubuntu 12.04 上libgnutls的版本比较新,装的filezilla 3.5.3,怎 ...
- ajax onblur 用法
value为当前框中的值 <input name="num"type="text" onblur="changeorder(id,this. ...
- IBATIS动态SQL(转)
直接使用JDBC一个非常普遍的问题就是动态SQL.使用参数值.参数本身和数据列都是动态SQL,通常是非常困难的.典型的解决办法就是用上一堆的IF-ELSE条件语句和一连串的字符串连接.对于这个问题,I ...
- js 创建对象 经典模式
1. 概述 通过构造函数创建对象, 有时忘记了写new, 这时函数就会返回undefined 可以创建一个函数createXXX, 在内部封装new. function Student(props){ ...
- linux 常用技巧
1--查看版本 查看内核版本 # cat /proc/version 查看linux版本 # lsb_release -a或者 cat /etc/issue 2--linux服务器测速 speedte ...