C#设计模式——抽象工厂
一、引言
我相信看到这段文字的人,都具备了良好的技术功底。但是对于自己编写的代码总是充满抱怨,希望能够将自己编写的代码如同房子一般先进行有效
的设计,然后在进行建设。那么这篇文章能够给你一些思路,这里特别的说明只是思路,因为你可以根据实际组合改变使用这里介绍的所有设计模式,而不是
跟遵守规章一样,一丝不苟。下面我们就开始按照三种类型的设计模式进行阐述。
二、创建型
在我们的代码中时时刻刻都充斥着创建对象,但是你曾今有无思考过,你的对象可以这么创建,也可以那么创建。同时还可以随时随刻切换。这是不
是难以置信?下面我们将会挖掘这其中的奥秘。
抽象工厂模式
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)
定义: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. 结构:(书中图,侵删) 这个图相对来说有一点点复杂,其实就是在工厂方法模式的基础上做了一些扩展,工厂方法模式只用于生成一种 ...
随机推荐
- JS 之作用域链和闭包
1.JS无块级作用域 <script> function Main(){ if (1==1){ var name = "alex"; } console.log(nam ...
- compile error
stray \241 程序有非法字符,如空格,引号等,一般因为从别的地方粘贴导致这个错误.
- cannot access the system temp folder
cannot access the system temp folder. please, make sure your application have full control rights on ...
- SQL镜像资料
使用数据库镜像端点证书 (Transact-SQL):https://msdn.microsoft.com/zh-cn/library/ms191477.aspx 允许数据库镜像端点将证书用于入站连接 ...
- jquery的常用ajax操作
$.ajax() 定义和用法 ajax() 方法通过 HTTP 请求加载远程数据. 该方法是 jQuery 底层 AJAX 实现.简单易用的高层实现见 $.get, $.post 等.$.ajax() ...
- CommandArgument传多个参数
CommandArgument='<%#Eval("id")+","+Eval("interName") %>'
- jsp学习---mvc模式介绍和el表达式,jstl标签库的使用入门
一.mvc模式介绍 下图是常用的mvc分层模式: 项目中的包命名规则,一般如下: com.amos.domain 封装JavaBean,一般我喜欢用model命名这个包com.amos.dao 封装d ...
- Java学习笔记15--引用传递
范例一 class Demo{ public int temp = 30; } public class T { public static void main(String[] args) { // ...
- sql server 2000通过机器名可以连,通过ip连不上的问题
客户那边两台服务器A和B,之前一直都是好好的,今天因为换了网络环境,结果数据库之间不能相互访问了. 目前只能A访问B,B访问不了A,在服务器A上面试了,通过ip连本机,也是连接超时. 开始想着是服务器 ...
- canvas基本用法
1.canvas和其他标签一样使用,但是IE8以下是不支持的,可以在canvas里面加一个span用来提示,例如: <canvas> <span>IE8不支持canvas< ...