设计模式读书笔记之简单工厂

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-01 21:49 点击:

 ---每一模式的出现都是为了解决某一种或某一类问题,或者对某种对象间的耦合关系进行解耦合,使紧耦合变成松耦合的关系。
1.前言(解耦过程)
 当我们还是一个刚刚入门或者刚刚接触面向对象程序员或者学习者的时候。我们会很习惯的用类来描述某一中具有相同属性的东西。
 如苹果。而且它有名字、皮等属性。然后我们就会定义一个苹果(Apple):

View Code
 1 public class Apple 2  { 3   public string Name{get;set;} 4   public Color Skin{get;set;} 5    6   public void Display() 7   { 8    Console.Write("我是苹果"); 9   }10  } 然后我们想得到一个苹果的时候,我们就很习惯得去做一件事件,代码和结构图如下:

View Code
1 Apple apple = new Apple {Name="苹果",Skin="Green"} 紧耦合结构图:

 \

                         图1-1

 然后有些人就会想到 我们既然学了苹果类,苹果可以这样写,那香蕉、葡萄等。代码如下:
 

View Code
 1 public class Banana 2  { 3   public string Name{get;set;} 4   public string Skin{get;set;} 5    6   public void Display() 7   { 8    Console.Write("我是香蕉"); 9   }10  }11  12  public class Grape13  {14   public string Name{get;set;}15   public string Skin{get;set;}16   17   public void Display()18   {19    Console.Write("我是葡萄");20   }21  }   多个紧耦合结构图:

 \

                          图1-2

 当自己慢慢对OO熟悉后 发现这样代码不好,所以稍作改善,应该采用接口或者抽象类来实现(多态)。
 所以定义了一个水果的接口,然后所有的水果的继承它。代码如下:
 

View Code
1 public Interface IFruit2  {3   public void Display();4  }  

 然后代码中就出现大量如下代码:
 

View Code
 1 IFruit fruit; 2 if(fruitType.Equal("Apple")) 3 { 4 fruit = new Apple{Name="苹果",Skin="Green"}; 5 }else if(fruitType.Equal("Banana")) 6 { 7 fruit =  new Banana{Name="香蕉",Skin="Yellow"}; 8 }else if(fruitType.Equal("Grape")) 9 {10 fruit =  new Grape{Name="葡萄",Skin="Grape"};11 } 使用了接口结构图:

 \

                      图1-3

 这样如果我以后增加了一个新类型的水果的话,要修改多处的逻辑代码。这样导致出现一个代码维护困难的问题。
 结果就想到用一个果园(Orchard)来解决此问题,果园可以为我们提供水果。代码如下:
 

View Code
 1 public class OrchardFactory 2  { 3   public IFruit ProvideFruit(string fruitType) 4   { 5    if(fruitType.Equal("Apple")) 6    { 7     return new Apple{Name="苹果",Skin="Green"}; 8    }else if(fruitType.Equal("Banana")) 9    {10     return new Banana{Name="香蕉",Skin="Yellow"};11    }else if(fruitType.Equal("Grape"))12    {13     return new Grape{Name="葡萄",Skin="Grape"};14    }15   }16  }17    

这样就解决了上面多出修改代码的问题了,但同时也引进了一个新问题,就是每次都要传进一个参数,而且提供水果的方法

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • 浅析.NET下XML数据访问新机制
    • asp.net 面试+笔试题目第1/2页
    • C# 邮件地址是否合法的验证
    • C#高级编程:数据库连接[1]
    • asp.net 设置GridView的选中行的实现代码
    • 经典C++程序1
    • IIS 自动回收导致后台定时器失效的问题解决
    • ASP.NET GridView列表代码示例
    • 微软ASP.NET站点部署指南(3):使用Web.Config文件的Transforma
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1