一、引言

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

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

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

二、创建型

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

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

  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. LeftoverDataException.

    在用java poi 3.8操作excel的时候,在打开一个已有excel文件时,有时候会报错: org.apache.poi.hssf.record.RecordInputStream$Leftov ...

  2. EMR,电子病历(Electronic Medical Record)

    电子病历 电子病历(EMR,Electronic Medical Record),也叫计算机化的病案系统或称基于计算机的病人记录(CPR,Computer-Based Patient Record). ...

  3. TJI读书笔记13-内部类

    TJI读书笔记13-内部类 TJI读书笔记13-内部类 创建内部类 内部类和外部类的关系 .this和.new 内部类和向上转型 局部内部类 匿名内部类 匿名内部类的定义和初始化 使用匿名内部类来实现 ...

  4. 8.4 H5知识点总结

    HTML简介 HyperText Markup Language 简称为HTML HyperText: 超文本 (文本 + 图片 + 视频 + 音频 + 链接) Markup Language: 标记 ...

  5. android开发 如何调用SO

    java package com.example.callsodemo; import android.R.integer; import android.R.string; import andro ...

  6. Java设计模式——装饰者模式

    JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...

  7. LVS集群类型

    一.LVS-NAT 简述:多目标的DNAT,通过Director修改请求报文中的目标地址和端口为LVS挑选出来的某RS的RIP和PORT实现转发 特点: (1)RIP和DIP必须在同一网络,且应该使用 ...

  8. [整理][LaTex]小技巧之——首行缩进

    0. 简介 在LaTex编辑时,有时会遇到这样一个有关于首行缩进的问题.在汉语环境的编辑下,习惯上每段会进行一个两个字的缩进.但是在默认编辑模式下,一个章节下的首段是没有首行缩进的,本文的目的主要是解 ...

  9. mongodb:短网址项目

    短网址项目概述 1.短网址项目,是将给定的长网址,转换成短网址. 如 新浪 http://t.cn/zQd5NPw ,其中zQd5NPw就是短网址 前段页面如下

  10. BDC批导数据

    1.输入事务代码SHBD进入以下界面: 点击新建记录,创建一个新的BDC录屏记录, 然后根据记录条件进行 BDC录屏代码 perform fill_bdc using ANLKL. call tran ...