一、引言

我相信看到这段文字的人,都具备了良好的技术功底。但是对于自己编写的代码总是充满抱怨,希望能够将自己编写的代码如同房子一般先进行有效

的设计,然后在进行建设。那么这篇文章能够给你一些思路,这里特别的说明只是思路,因为你可以根据实际组合改变使用这里介绍的所有设计模式,而不是

跟遵守规章一样,一丝不苟。下面我们就开始按照三种类型的设计模式进行阐述。

二、创建型

在我们的代码中时时刻刻都充斥着创建对象,但是你曾今有无思考过,你的对象可以这么创建,也可以那么创建。同时还可以随时随刻切换。这是不

是难以置信?下面我们将会挖掘这其中的奥秘。

  1. 抽象工厂模式

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#设计模式——抽象工厂的更多相关文章

  1. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

  2. 5. 星际争霸之php设计模式--抽象工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  3. linkin大话设计模式--抽象工厂

    linkin大话设计模式--抽象工厂 在前面讲到的简单工厂里面虽然实现了我们那个类和其中的依赖的解耦,但是在产生我们需要的依赖的那个工厂里面还是和具体的产品类耦合了  现在要是还想彻底解耦的话怎么办呢 ...

  4. 设计模式——抽象工厂(Abstract Factory)

    Abstract Factory 抽象工厂模式(创建型模式): new的问题:实现依赖,不能应变应对“具体实例化类型”的变化. 解决思路:--封装变化点:哪里变化,封装哪里           - - ...

  5. JAVA设计模式--抽象工厂模式

    抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...

  6. 深入浅出设计模式——抽象工厂模式(Abstract Factory)

    模式动机在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法.但是有时候我们需要一个工厂可 ...

  7. 24种设计模式--抽象工厂模式【Abstract Factory Pattern】

    女娲造人,人是造出来了,世界是热闹了,可是低头一看,都是清一色的类型,缺少关爱.仇恨.喜怒哀乐等情绪,人类的生命太平淡了,女娲一想,猛然一拍脑袋,忘记给人类定义性别了,那怎么办?抹掉重来,然后就把人类 ...

  8. C++设计模式——抽象工厂模式

    问题描述 之前讲到了C++设计模式——工厂方法模式,我们可能会想到,后期产品会越来越多了,建立的工厂也会越来越多,工厂进行了增长,工厂变的凌乱而难于管理:由于工厂方法模式创建的对象都是继承于Produ ...

  9. 设计模式 | 抽象工厂模式(abstract factory)

    定义: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. 结构:(书中图,侵删) 这个图相对来说有一点点复杂,其实就是在工厂方法模式的基础上做了一些扩展,工厂方法模式只用于生成一种 ...

随机推荐

  1. C++中关于string类型究竟能不能用cout输出的问题

    先让我讲下故事哈 一次在MFC中用cout输出一个string类型字符串,编译时出现这样一个错误: error C2679: binary '<<' : no operator defin ...

  2. #error作用

    指令 用途 # 空指令,无任何效果 #include 包含一个源代码文件 #define 定义宏 #undef 取消已定义的宏 #if 如果给定条件为真,则编译下面代码 #ifdef 如果宏已经定义, ...

  3. Mycat配置文件rule.xml

    打开<MyCAT_HOME>/conf/rule.xml,对应的分片配置截取内容如下: <tableRule name="auto-sharding-rang-mod&qu ...

  4. MySQL_财务统计各产品品类各城市上周收入毛利表_20161202

    注:财务需要统计各产品品类各城市上周毛利情况 下面这样的表是沟通后展现的形式.数据展现形式我认为的大都是行列转 列转行的转置 从财务角度这样展现形式比较适合. 由于黄色部分为汇总项目,因此我拆分成9个 ...

  5. 在MS SQLSERVER中如何最快的速度清空所有用户表的数据

    有时候我们需要清空数据库中所有用户表的数据,如果一张表一张表的清空的话,遇到一个庞大的数据系统估计得崩溃了.  用游标加上用变量来引用表名就可以做到这一点. 用变量来引用表名对表操作可以用在存储过程中 ...

  6. 解决VMware“该虚拟机似乎正在使用中”问题

    http://jingyan.baidu.com/article/4ae03de3fa2ae93eff9e6bb0.html

  7. cognos函数学习

    1.aggregate(currentMeasure within set set([意健险], [财产险], [车险])) 汇总所有 2.tuple([保费],[车险]) 3.percentage( ...

  8. Linux程序包管理初步-yum的使用

    何为yum? yum:由yellow dog研发,全称Yellowdog Update Modifier 是rhel系列系统上rpm包管理器的前端工具,可用来自动解决依赖关系,从而更好的实现程序包的安 ...

  9. B. Santa Claus and Keyboard Check 模拟

    http://codeforces.com/contest/752/problem/B uuu yyu xy xx 注意变化了之后,检查一次前面已经变化过的就好.因为可能前面的满足,但是变了后不满足. ...

  10. EXCEL工作表保护密码忘记了,如何撤消工作表保护?

    按下面步骤操作,如果不会发邮件给我吧 SamRichard@live.cn 1\打开文件 2\工具---宏----录制新宏---输入名字如:aa 3\停止录制(这样得到一个空宏) 4\工具---宏-- ...