设计模式_创建型模式_简单工厂模式_案例

使用简单工厂模式设计一个可以创建不同几何形状(如圆形、方形和三角形等)的绘图工具,

每个几何图形都具有绘制draw()和擦除erase()两个方法,

要求在绘制不支持的几何图形时,提示一个UnSupportedShapeException。

结构图如下:

AbstractDrawTools  所有绘图工具的基类,是个抽象工厂类,抽取了三个绘图工具的共有方法Draw() Erase()当成抽象方法

这里简化了工厂类,把工厂类中的创建对象的静态方法移植到这个类中.

CaspuleTool  胶囊绘图工具类

SphereTool   球形绘图工具类

CubeTool     立方体绘图工具类

这三个工具类实现基类的二个抽象方法,而且还可以在类中写特有的一些方法或者属性

Program  这是控制台应用程序入口类,在main函数中去调用AbstractDrawTools中的GetDrawTool方法,传递指定工具名称,

返回一个绘图工具对象.如果工具名称对应的工具类不存在,返回Null,输出提示UnSupportedShapeException.

具体代码如下:

AbstractDrawTools

 1 namespace SimpleFactory
 2 {
 3     /// <summary>
 4     /// 所有绘图工具类的基类
 5     /// </summary>
 6     abstract class AbstractDrawTools
 7     {
 8         //通过绘图工具名称,返回一个绘图工具
 9         public static AbstractDrawTools GetDrawTool(string drawToolName)
10         {
11             AbstractDrawTools drawTool = null;
12             switch (drawToolName)
13             {
14                 case "球形": drawTool = new SphereTool(); break;
15                 case "立方体": drawTool = new CubeTool(); break;
16                 case "胶囊体": drawTool = new CapsuleTool();break;
17                 default: break;
18             }
19
20             return drawTool;
21         }
22
23         public abstract void Draw();
24         public abstract void Erase();
25     }
26 }

CaspuleTool

 1 namespace SimpleFactory
 2 {
 3     /// <summary>
 4     /// 胶囊体绘图类
 5     /// </summary>
 6     class CapsuleTool : AbstractDrawTools
 7     {
 8         public override void Draw()
 9         {
10             Console.WriteLine("绘制胶囊体");
11         }
12
13         public override void Erase()
14         {
15             Console.WriteLine("擦除胶囊体");
16         }
17     }
18 }

SphereTool

 1 namespace SimpleFactory
 2 {
 3     /// <summary>
 4     /// 球形绘图类
 5     /// </summary>
 6     class SphereTool : AbstractDrawTools
 7     {
 8         public override void Draw()
 9         {
10             Console.WriteLine("绘制球形");
11         }
12
13         public override void Erase()
14         {
15             Console.WriteLine("擦除球形");
16         }
17     }
18 }

CubeTool

 1 namespace SimpleFactory
 2 {
 3     /// <summary>
 4     /// 立方体绘图类
 5     /// </summary>
 6     class CubeTool : AbstractDrawTools
 7     {
 8         public override void Draw()
 9         {
10             Console.WriteLine("绘制立方体");
11         }
12
13         public override void Erase()
14         {
15             Console.WriteLine("擦除立方体");
16         }
17     }
18 }

Program

 1 namespace SimpleFactory
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             //通过抽象绘图工厂类得到一个球形工具
 8             AbstractDrawTools drawTool = AbstractDrawTools.GetDrawTool("球形");
 9
10             if (drawTool != null)
11             {
12                 //调用其中的方法进行绘制和擦除
13                 drawTool.Draw();
14                 drawTool.Erase();
15             }
16             Console.WriteLine("**********************");
17             //通过抽象绘图工厂类得到一个胶囊工具
18             drawTool = AbstractDrawTools.GetDrawTool("胶囊体");
19             if (drawTool != null)
20             {
21                 drawTool.Draw();
22                 drawTool.Erase();
23             }
24             Console.WriteLine("**********************");
25             //如果传递不存在的绘图工具,就返回一个空对象
26             drawTool = AbstractDrawTools.GetDrawTool("圆柱形");
27             if (drawTool == null)
28             {
29                 Console.WriteLine("UnSupportedShapeException");
30             }
31             else
32             {
33                 drawTool.Draw();
34                 drawTool.Erase();
35             }
36
37             Console.Read();
38         }
39     }
40 }

输出结果:

总结:

使用简单工厂模式后,当需要增加新的绘图工具类,需要做如下改动:

1. 添加新的绘图类.

2. 修改AbstractDrawTools类的逻辑代码,对新的绘图类进行判断

3.修改main函数调用GetDrawTool()方法时传递的参数

这里把main函数中的代码看成是上层模块,那每次有新的类都得修改其中的参数,

不符合开闭原则…代码需要做修改.

原文地址:https://www.cnblogs.com/fzxiaoyi/p/8531721.html

时间: 2024-09-29 03:20:09

设计模式_创建型模式_简单工厂模式_案例的相关文章

java设计模式 -------- 创建模式 之 简单工厂模式

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 工厂模式是最常用的模式,因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a = new A(),工厂模式也是用来创建用来创建实例对象的,所以以后new时要多个心眼,是否可以考虑使用工厂模式. 简单工厂模式又可以分成三种模式: 1) 普通简单工厂模式 2) 多方法简单工厂模式 3) 多静态方法简单工厂模式 普通简单工厂模式: 举例:(简单的

设计模式在cocos2d-x中的使用--简单工厂模式(Simple Factory)

什么是简单工厂模式? 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 简单工厂模式在cocos2d-x中怎么用,我们通过下面的小例子来了解一下. 假如我们在开发一款类似魔兽的RPG游戏,在游戏中会出现很多种族的角色,如:人族.兽族. 这些种族一般都会定义为一个类,如果兽族Orc类,人族Human类. 兽族.人族两个类都同样属于种族,那么我们可以

设计模式笔记——策略模式VS简单工厂模式

策略模式VS简单工厂模式   策略模式(Strategy)它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. 1.组成 -抽象策略角色: 策略类,通常由一个接口或者抽象类实现. -具体策略角色:包装了相关的算法和行为. -环境角色:持有一个策略类的引用,最终给客户端调用. 2.应用场景 - 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为. -需要在不同情况下使用不同的策略(算法),或者策略还可能在未来

设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)

原文地址:http://blog.chinaunix.net/uid-25958655-id-4243289.html 简单工厂模式 当需要加法类的时候,调用工厂类的CreateOperate(),要指定制造的Product 例如在大话设计模式P11给的运算工厂例子: public static Operation createOperate(string operate) { Operation oper = null; 12 switch (operate) { case "+":

(二)设计模式之PHP项目应用(简单工厂模式:计算器)

1 简单工厂模式简介 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例. 2 模式组成 1)工厂(Creator)角色 简单工厂模式的核心,它负责实现创建所有实例的内部逻辑.工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象. 2)抽象产品(Product)角色 简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口. 3)具体产品(Concrete Product)角色 是简单工厂模式的创建目标,所

设计模式学习笔记(二)--简单工厂模式和工厂模式

老生长谈的两个设计模式了,这里把这两个设计模式对比着来总结一下. 什么是简单工厂模式? 简单工厂模式:根据传入工厂类的参数动态决定要创建哪一个产品类的实例. UML图如下(以实现一个计算器为例): 简单工厂模式的Java代码实现如下: 1 package designPattern; 2 /** 3 * 简单工厂模式 4 * @author yiRain 5 * 6 */ 7 public class SimpleFactory { 8 9 public static void main(Str

设计模式之策略模式&amp;amp;简单工厂模式

学习设计模式已经有非常长一段时间了,事实上先前已经敲过一遍了.可是老认为没有学到什么,认识也不够深刻.如今趁着重构机房,再又一次来过,也不晚. 事实上在敲了机房之后,看看模式,事实上,曾经非常难理解.非常难看懂的代码一眼就能够看懂了,趁着有点感觉了.早点收获吧. 简单工厂模式: 简单地说简单工厂模式:非常easy变化的地方,就能够用到简单工厂模式. 实例: 举个样例:我们在逛商场时.正好商场促销,各种优惠活动:有满300返100 ,有打8折的.抽奖等等吧. 促销来讲,各种优惠活动事实上就是变化.

大话设计模式第八章---工厂模式及简单工厂模式比较

(简单工厂模式) (工厂模式) 简单工厂模式: 最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖.不过,违背了开放-封闭原则. 工厂模式: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 工厂模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断转移到了客户端代码来进行.你想要加功能,在简单工厂模式中是改工厂类

策略模式与简单工厂模式

1,简单工厂模式 a) 有一个抽象的接口用来表示工厂需要生产的产品共性:然后各个具体的产品类实现该抽象接口. b) 工厂只需要持有产品的抽象接口,工厂接收一个 TYPE 参数来决定生产何种产品. c) 对于客户而言,当他需要某种类型的产品时,只需要获得工厂对象,然后将产品的 TYPE参数传递给工厂,由工厂创建他所需要的产品. 2,策略模式 策略,本质上是一种算法.当客户需要处理某件事情时,由于所处的环境不同,他可以采取不同的方式(策略)去处理.因此,客户关注的是如何方便得获取所需的策略. a)

java笔记--策略模式和简单工厂模式

策略模式: --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3884781.html "谢谢-- 为什么使用:策略模式主要用于有很多不同的方式来解决同一个问题的情景.如:文件的保存:可保存成txt,也可保存成xml.另外压缩文件.商场的促销策略等是类似的 如何使用:需要定义一个接口或者抽象类来表示各种策略的抽象,由于在选择适当的策略上有些不方便,需要不断地判断需要的类型,因此需要用简单工厂方法来实现判断过程 例子: 用策略模式实现图