黑马程序员技术交流社区

标题: 设计模式:工厂模式的理解,希望能阐述的生动容易理解点 [打印本页]

作者: f805616873    时间: 2014-3-24 13:07
标题: 设计模式:工厂模式的理解,希望能阐述的生动容易理解点
对于设计模式:工厂模式模式的理解不是很透彻,希望能得到容易理解的答案。

作者: cmcm2014    时间: 2014-3-24 13:07
首先我举一个代码的例子吧
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")就实现了。
希望你能理解谢谢





作者: Doublekill    时间: 2014-3-24 13:25
先定义一个类,主要声明一个家具接口,床和椅子的类:
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);
就这样预期想实现的,通过这样就实现了.当然这个例子比较简单,但是它却通过工厂模式的思想实现了代码的灵活性.应用软件系统开发中,有许多地方可以考虑使用工厂模式.比如在写数据层的代码时候,考虑到程序的可移植性,可拓展性,面向不同的数据库时,采用工厂模式不为是一件理想的实现方式.
作者: cmcm2014    时间: 2014-3-24 13:29
如果你还是不太理解的话,我推荐给你一本书《大话设计模式》 书中的例子可能更容易理解,非常好的一本书,希望楼主读完之后对设计模式有很好的理解
作者: f805616873    时间: 2014-3-24 13:31
cmcm2014 发表于 2014-3-24 13:27
首先我举一个代码的例子吧
public class Ball
    {  

虽然还不是太理解,但是你推荐的书我下了电子档,看了一下,发现这本书很好。可能是我对接口,抽象类等基础知识还是不太理解,所以导致设计模式也不理解,我先复习下吧。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2