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)
定义: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. 结构:(书中图,侵删) 这个图相对来说有一点点复杂,其实就是在工厂方法模式的基础上做了一些扩展,工厂方法模式只用于生成一种 ...
随机推荐
- 解决ubuntu中apache2的url大小写敏感问题。
cd /etc/apache2/mods-enabled ln -s ../mods-available/speling.load speling.load ln -s ../mods-availab ...
- Mac系统默认MAWP配置
MAC系统是自带apache的,配置起来也很容易,但是本身是不支持php的需要手动开启一下,这里记录一下配置过程 1.apache配置文件在/etc/apache2/httpd.conf,把Docum ...
- {matlab}取二值图像centroid几种方法性能比较
试验很简单,取二值图像的质心,三种方法做比较 1.完全采用矩阵性能不做任何循环操作,对find后的值进行除法与取余操作,从而得到centroid 2.完全采用循环操作,最简单明了 3.结合1,2,对每 ...
- MongoDB-JAVA-Driver 3.2版本常用代码全整理(3) - 聚合
MongoDB的3.x版本Java驱动相对2.x做了全新的设计,类库和使用方法上有很大区别.例如用Document替换BasicDBObject.通过Builders类构建Bson替代直接输入$命令等 ...
- 使用__slots__
[使用__slots__] 参考: 1.http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a0 ...
- Android自定义ImageView实现图片圆形 ,椭圆和矩形圆角显示
Android中的ImageView只能显示矩形的图片,为了用户体验更多,Android实现圆角矩形,圆形或者椭圆等图形,一般通过自定义ImageView来实现,首先获取到图片的Bitmap,然后通过 ...
- Selenium2+python自动化18-加载Firefox配置
前言 有小伙伴在用脚本启动浏览器时候发现原来下载的插件不见了,无法用firebug在打开的页面上继续定位页面元素,调试起来不方便 . 加载浏览器配置,需要用FirefoxProfile(profile ...
- Java 基础知识总结 (四、String)
四.String public final class String extends Object implements Serializable, Comparable<String>, ...
- javascript 按ctrl和enter键提交表单
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- iOS大神牛人的博客集合
王巍的博客:王巍目前在日本横滨任职于LINE.工作内容主要进行Unity3D开发,8小时之外经常进行iOS/Mac开发.他的陈列柜中已有多款应用,其中番茄工作法工具非常棒. http://onevca ...