一、引言
我相信看到这段文字的人,都具备了良好的技术功底。但是对于自己编写的代码总是充满抱怨,希望能够将自己编写的代码如同房子一般先进行有效
的设计,然后在进行建设。那么这篇文章能够给你一些思路,这里特别的说明只是思路,因为你可以根据实际组合改变使用这里介绍的所有设计模式,而不是
跟遵守规章一样,一丝不苟。下面我们就开始按照三种类型的设计模式进行阐述。
二、创建型
在我们的代码中时时刻刻都充斥着创建对象,但是你曾今有无思考过,你的对象可以这么创建,也可以那么创建。同时还可以随时随刻切换。这是不
是难以置信?下面我们将会挖掘这其中的奥秘。
抽象工厂模式
1.1 这里我们将会以一个功能来说明其特点。
- 在如今的Web应用程序中HTML5正在成为趋势,但是仍然不乏很多不支持HTML5的浏览器。但是我们需要开发一个能够让开发者进行绘图的
通用画布,能够判断浏览器是否支持HTML5,从而决定绘图的方式。 - 我们的解决方案是公开一个画布的抽象类,并且对于能够创建的各种图形提供统一的接口。
1.2 设计矩形必须具备的特性:
abstract class BaseRectangle
{
//设置边框宽度
abstract public void SetLineWidth(int width);
//绘制矩形
abstract public void DrawRect(int x1, int y1, int x2, int y2);
}
1.3 设计线条必须具备的特性:
abstract class BaseLine
{
//设置现宽度
abstract public void SetWidth(int width);
//绘制线
abstract public void DrawLine(int x1, int y1, int x2, int y2);
}
1.4 设计画布必须具备的特性:
abstract class CanvasFactory
{
//创建一个矩形
abstract public BaseRectangle CreateRectangle();
//创建一条线
abstract public BaseLine CreateLine();
}
1.5 以下用HTML5实现画布功能
1.5.1 HTML5实现画线条
class HTML5Line : BaseLine
{
public override void DrawLine(int x1, int y1, int x2, int y2)
{
Console.WriteLine("draw html5 line!");
} public override void SetWidth(int width)
{
Console.WriteLine("set html5 line whdth");
}
}
1.5.2 HTML5实现画矩形
class HTML5Rectangle : BaseRectangle
{
public override void DrawRect(int x1, int y1, int x2, int y2)
{
Console.WriteLine("draw html5 rect");
} public override void SetLineWidth(int width)
{
Console.WriteLine("set html5 rect");
}
}
1.5.3 HTML5实现的画布
class HTML5Canvas : CanvasFactory
{
public override BaseRectangle CreateRectangle()
{
return new HTML5Rectangle();
} public override BaseLine CreateLine()
{
return new HTML5Line();
}
}
1.6 通过本地Graphical生成图片
1.6.1 Graphical实现画线条
class GraphicalLine : BaseLine
{
public override void DrawLine(int x1, int y1, int x2, int y2)
{
Console.WriteLine("draw graphical line");
} public override void SetWidth(int width)
{
Console.WriteLine("set graphical line width");
}
}
1.6.2 Graphical实现画矩形
class GraphicalRectangle : BaseRectangle
{
public override void DrawRect(int x1, int y1, int x2, int y2)
{
Console.WriteLine("draw graphical rect");
} public override void SetLineWidth(int width)
{
Console.WriteLine("set graphical rect width");
}
}
1.6.3 Graphical实现的画布
class GraphicalCanvas : CanvasFactory
{
public override BaseLine CreateLine()
{
return new GraphicalLine();
} public override BaseRectangle CreateRectangle()
{
return new GraphicalRectangle();
}
}
1.6 下面我们模拟切换使用不同的方式实现画图
class Program
{
static void Draw(CanvasFactory canvas)
{
BaseLine line = canvas.CreateLine();
BaseRectangle rect = canvas.CreateRectangle();
line.SetWidth();
line.DrawLine(,,,);
rect.SetLineWidth();
rect.DrawRect(, , , );
} static void Main(string[] args)
{
HTML5Canvas html5 = new HTML5Canvas();
GraphicalCanvas graphical = new GraphicalCanvas();
//不支持HTML5时
bool enabHtml5 = false;
if (!enabHtml5)
{
Draw(graphical);
} //支持HTML5时
enabHtml5 = true;
if (enabHtml5)
{
Draw(html5);
}
Console.ReadKey();
}
}
1.7 结论:
这里我们其实就是公开了一个画布的抽象类以及两种图形的抽象类,用于给客户使用的,而我们程序的内部会决定采用那种方式。这样的好处
就是我们将底层的实现以及类名都隐藏了,同时客户使用的时候只需要关注如何使用,而无需关注是哪个具体的类去实现客户的需求。
C#设计模式——抽象工厂的更多相关文章
-
设计模式——抽象工厂模式及java实现
设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...
-
5. 星际争霸之php设计模式--抽象工厂模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
-
linkin大话设计模式--抽象工厂
linkin大话设计模式--抽象工厂 在前面讲到的简单工厂里面虽然实现了我们那个类和其中的依赖的解耦,但是在产生我们需要的依赖的那个工厂里面还是和具体的产品类耦合了 现在要是还想彻底解耦的话怎么办呢 ...
-
设计模式——抽象工厂(Abstract Factory)
Abstract Factory 抽象工厂模式(创建型模式): new的问题:实现依赖,不能应变应对“具体实例化类型”的变化. 解决思路:--封装变化点:哪里变化,封装哪里 - - ...
-
JAVA设计模式--抽象工厂模式
抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...
-
深入浅出设计模式——抽象工厂模式(Abstract Factory)
模式动机在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法.但是有时候我们需要一个工厂可 ...
-
24种设计模式--抽象工厂模式【Abstract Factory Pattern】
女娲造人,人是造出来了,世界是热闹了,可是低头一看,都是清一色的类型,缺少关爱.仇恨.喜怒哀乐等情绪,人类的生命太平淡了,女娲一想,猛然一拍脑袋,忘记给人类定义性别了,那怎么办?抹掉重来,然后就把人类 ...
-
C++设计模式——抽象工厂模式
问题描述 之前讲到了C++设计模式——工厂方法模式,我们可能会想到,后期产品会越来越多了,建立的工厂也会越来越多,工厂进行了增长,工厂变的凌乱而难于管理:由于工厂方法模式创建的对象都是继承于Produ ...
-
设计模式 | 抽象工厂模式(abstract factory)
定义: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. 结构:(书中图,侵删) 这个图相对来说有一点点复杂,其实就是在工厂方法模式的基础上做了一些扩展,工厂方法模式只用于生成一种 ...
随机推荐
-
jquery获取table的行数、列数
$("#grd").find("tr").length; //行数 $("#grd").find("tr").find( ...
-
MVVM架构~knockoutjs系列之为validation.js扩展minLength和maxLength
返回目录 为什么要对minLength和maxLength这两个方法进行扩展呢,是因为这样一个需求,在用户注册时,可以由用户自己决定他们输入的字符,中文,英文,数字均可,这样做了之后,使用户的体验更好 ...
-
关于JDK的配置
① 安装官网下载的相应JDK安装包. 现在官网主推JDK8,JDK7以及更老的版本需要注册才能提供下载链接. ② 比如个人下载的jdk7-xxx.exe,安装路径为C:\Program Files\J ...
-
Excel VBA 快捷键 代码
一. 在ThisWorkbook中 Private Sub Workbook_Open() '%对应alt键 宏不能加() Application.OnKey "%q", &quo ...
-
c#中使用数据读取器读取查询结果
今天有时间了. 在看<c#数据库入门经典> ,总结数据读取器查询结果. 针对单个结果集使用读取器,有3中方法: String connString =..; String sql =@&q ...
-
一个3D视频播放器的演示APK
介绍: 这个APK是把视频显示分割成左右对等的两幅画面.同时无缝显示在屏幕上, 配合类似谷歌的cartdboard "纸片壳" 或市面上的魔镜等3D眼镜来播放视频画面, 根据3D眼 ...
-
变量类型-Number
教程:一:数字类型 (1)int 没有限制大小,有以下的四种表现形式: 1:2进制:以'0b'开头---bin 2:8进制:以'0o'开头---oct 3:1 ...
-
【NOI2008】志愿者招募
[NOI2008]志愿者招募 和[2017山东day7]养猫做法类似. 都是神仙题. 首先我设\(c_{i,j}=[l[j]\leq i\leq r[j]]\) ,于是就可以列出下面的不等式: \[ ...
-
Go语言从入门到放弃(二) 优势/关键字
本来这里是写数据类型的,但是规划了一下还是要一步步来,那么本篇就先介绍一下Go语言的 优势/关键字 吧 本章转载 <The Way to Go>一书 Go语言起源和发展 Go 语 言 起 ...
-
WINDOWS 2008Server 配置nginx 反向代理服务器 安装成服务
本案例有用过可行 反向代理就是是网站通过一台机器发布到公网,客户访问的时候是直接访问那台代理机器的,然后通过那台机器才访问到内网网站. 0.先要在域名官网上面配置域名对应的IP地址,然后要在自己路 ...