A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

1黑马币
对于设计模式:工厂模式模式的理解不是很透彻,希望能得到容易理解的答案。

最佳答案

查看完整内容

首先我举一个代码的例子吧 public class Ball { public string Play(string ballType) { return “Play+"ballType"”; } } public class FootBall: Ball { public override string Play(string ballType) { return “Play+ballType”; } } public class BasketBall: Ball { public ...

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

4 个回复

倒序浏览
首先我举一个代码的例子吧
public class Ball
    {  
        public string Play(string ballType)  
        {  
            return “Play+"ballType"”;
        }  
    }  
  
    public class FootBall: Ball
    {  
        public override string  Play(string ballType)  
        {  
                return “Play+ballType”;
        }  
    }  
  
   public class BasketBall: Ball
    {  
        public override string  Play(string ballType)  
        {  
                return “Play+ballType”;
        }  
    }  
    创建简单工厂public static Bal CreatObject(string operate)  
        {  
            Operation oper = null;  
            switch (operate)  
            {  
                case "FootBall":  
                    oper = new FootBall();  
                    break;  
                case "BasketBall":  
                    oper = new OperationSub();  
                    break;  
                case "*":  
                    oper = new BasketBall();  
                    break;   
                default:  
                    break;  
            }  
            return oper;  
        }
调用工厂:

Ball b=CreatObject.Play("FootBall");

工厂模式其实就是不需要你做实例化类的操作,已经有了一个实例化类的处理。
本例中有一个Ball的类,一个抽象方法Play,然后2个子类,足球,篮球。Play()不知道玩的是什么球类,但是你传入FootBall时,因为有了CreatObject这个方法,他自己去匹配需要实例化的对象是谁,所以Ball a=CreatObject.Play("FootBall")就实现了。
希望你能理解谢谢




评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

回复 使用道具 举报
先定义一个类,主要声明一个家具接口,床和椅子的类:
Public interface IFurniture
{
}
public class Bed:IFurniture
{
 public Bed()
 {
  Console.WriteLine("I need a bed!");
 }
}
public class Desk:IFurniture
{
 public Desk()
 {
  Console.WriteLine("I need a desk!");
 }
}
public class Chair:IFurniture
{
 public Chair()
 {
  Console.WriteLine("I need a chair!");
 }
}
再定义一个家具工厂的类(可以利用反射机制中Type类获取Name指定的类名的类的Type信息,然后可以根据这个信息利用System.Activator创建对象):
public class FurnitureFactory
{
 public IFurniture MakeFurniture(string Name)
 {
  IFurniture MyFurniture = null;
  try
  {
   Type type = Type.GetType(Name,true);
   MyFurniture = (IFurniture)Activator.CreateInstance(type);
  }
  catch (TypeLoadException e)
   Console.WriteLine("I dont know this kind of furniture,
      exception caught - {0}" ,e.Message);
   return MyFurniture;
 }
}
然后在以客户端进行程序调用:
string FurnitureName = Console.ReadLine();
IFurniture MyFurniture;
FurnitureFactory MyFurnitureFactory = new FurnitureFactory();
MyFurniture = MyFurnitureFactory.MakeFurniture(FurnitureName);
就这样预期想实现的,通过这样就实现了.当然这个例子比较简单,但是它却通过工厂模式的思想实现了代码的灵活性.应用软件系统开发中,有许多地方可以考虑使用工厂模式.比如在写数据层的代码时候,考虑到程序的可移植性,可拓展性,面向不同的数据库时,采用工厂模式不为是一件理想的实现方式.

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

回复 使用道具 举报
如果你还是不太理解的话,我推荐给你一本书《大话设计模式》 书中的例子可能更容易理解,非常好的一本书,希望楼主读完之后对设计模式有很好的理解
回复 使用道具 举报
cmcm2014 发表于 2014-3-24 13:27
首先我举一个代码的例子吧
public class Ball
    {  

虽然还不是太理解,但是你推荐的书我下了电子档,看了一下,发现这本书很好。可能是我对接口,抽象类等基础知识还是不太理解,所以导致设计模式也不理解,我先复习下吧。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马