用户操作
[留言]  [发消息]  [加为好友] 
订阅我的博客
XML聚合    FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
jonnie4455的公告
<a href=" http://wpa.qq.com/msgrd?V=1&Uin=694395908&Exe=QQ&Site=新人世界&Menu=yes" target="about:blank"><img src=" http://wpa.qq.com/pa?p=1:694395908:1" border="0"/>694395908</a><p/> <a href=" http://www.pledu.com" target="about:blank"> <img src=" http://p.blog.csdn.net/images/p_blog_csdn_net/mengyuxiang/ad.jpg" > </a>
文章分类
南京北大青鸟
南京北大青鸟
存档

原创  Simple Factory模式 Factory Method模式 Abstract Factory模式之代码入门篇(一) 收藏

 Simple Factory模式

一、简单工厂

      简单工厂模式中工厂为具体工厂,产品为抽象产品,由工厂实例创建产品实例。

示例图:

 

 

1  在这里,我们先定义水果(IFruit)接口:
public interface IFruit {
  void Plant();  //水果是被种植的
  void EnableEat();  //水果能吃
}
2  苹果(Apple)是对水果(IFruit)接口的实现:
public class Apple : IFruit{
  public void plant(){
    Console.WriteLine("种苹果!");
  }
  public void enableEat(){
    Console.WriteLine("苹果好吃!");
  }
}
3  鸭梨(Pear)是对水果(IFruit)接口的实现:
public class Pear : Fruit{
  public void plant(){
    Console.WriteLine("种鸭梨!");
  }
  public void enableEat(){
    Console.WriteLine("鸭梨好吃!");
  }
}
4、定义买水果工厂(SimpleFactory):
public class SimpleFactory {
  /**
  * 简单工厂方法
  */
  public IFruit buyFruit(String name){
    if (name. Equals ("apple")) {  //如果是苹果,则返回苹果实例
      return new Apple();
    }
    else if (name. Equals ("pear")){  //如果是鸭梨,则返回鸭梨实例
      return new  pear();
    }
    else{
      return null;
    }
  }
}
5  编写测试类:
public class FruitTest {
  public static void  main(String[] args){
    SimpleFacotry sf = new SimpleFacotry ();   //去工厂买水果
    sf.buyFruit("apple").enableEat(); //调用苹果的enableEat()方法
  }
}

6 说明:

A:我要购买苹果,只需向工厂角色(BuyFruit)请求即可。而工厂角色在接到请求后,会自行判断创建和提供哪一个产品。

B:但是对于工厂角色(BuyFruit)来说,增加新的产品(比如说增加草莓)就是一个痛苦的过程。工厂角色必须知道每一种产品,如何创建它们,以及何时向客户端提供它们。换言之,接纳新的产品意味着修改这个工厂。

C:因此Simple Factory模式的开放性比较差。

有什么办法可以解决这个问题吗?

1)      那就需要Factory Method模式来为我们服务了。

2)      反射得到对应的对象

反射改写4、定义买水果工厂(SimpleFactory):

public class SimpleFactory

    {

        public Fruit BuyFruit(string name)

        {

             return (Fruit) Assembly.Load("Factory").CreateInstance("Factory."+name) ;

            // Assembly.Load("项目名称").CreateInstance("包名.类名");

        }

    }

     

发表于 @ 2008年07月22日 07:46:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:c# 自动控制格式(快捷鍵) | 新一篇:tomcat5.5与tomcat6.0配置虚拟目录的区别

  • 发表评论
  • 评论内容:
  •  
Copyright © jonnie4455
Powered by CSDN Blog