什么是简单工厂设计模式啊?它到底该怎么应用到程序中呢?今天做了一个软件,涉及到简单工厂的一些知识,本人刚接触C#,在书本上接触到简单工厂的案例不多。但我做的这个软件的简单工厂在其中的应用是:先建一个工厂类,然后在类里面定义一个方法,然后用Switch判断类型。再在控件的事件中创建对应类的对象,调用在工厂类里面定义的这个方法。就这样了,虽然功能实现了,但我还是不懂怎么做啊!请各位详解一点有关简单工厂的程序中解决问题的一般思路。谢谢!

解决方案 »

  1.   

    简单工厂模式是软件设计模式的一种比较简单的创建型模式,
    主要是一个返回基类静态的方法,来根据需求创建基类的子类对象。
    这里用到了OOP里的多态。
      

  2.   

    给你个基本概念譬如两个基类继承自同一个接口
    interface in
    class a : interface infa
    class b : interface infa使用时要根据实据情况调用那个类
    就在工厂类中实现,如下,
    infa ob
    if (条件)
    {ob=new a }
    else
    {ob=new b }
      

  3.   

    简单工厂 也叫静态工厂:涉及到工厂角色,抽象产品,以及具体产品角色等。
    一般情况下就是根据参数数据返回一个适当的子类,然后用基类或接口引用具体的对象,而不用考虑该实际对象的产生过程.
    参考
    http://www.cnblogs.com/ipusr/articles/574465.aspx
    http://www.cnblogs.com/fineboy/archive/2005/08/04/207293.html
      

  4.   

    这是设计模式,了解工厂模式怎么实现没有用,要知道为什么要使用它。所有的设计模式都是为了实现高内聚低耦合而存在的,工厂模式是比较简单的封装。工厂负责生产产品(生产产品==创建实例)。而且工厂只生产相似的产品(实现同一接口的产品),如果不是相似的产品,我们就无法使用接口,不使用接口,那么你在调用时,就还是和具体的产品类耦合了(接口才是降低耦合的关键所在,在调用时无论是什么具体类,你只能看到接口,这样你调用的地方就只和接口和工厂类耦合,接口只有一个,如果是和具体的类耦合,那么有三个具体类你就要和三个类耦合。)。这样就没什么意义了,因为没有达到降低耦合的目的。当然一个工厂,不止只可以生产一种产品(注意是一种不是一个),也可以生产多种产品(不同种类的产品实现不同的接口)。那么工厂模式,就得有多个工厂方法,每个工厂方法,负责生产一种产品。再扩展一下,工厂也可以继续抽象。因为不同的工厂虽然都生产同样的几种产品,但是具体产品的要求比较严格。例如,戴尔的笔记本上有主板和CPU,华硕的本子上也可以有主板和CPU,但是戴尔的主板使用微星,CPU是 INTEL,但华硕的本子主板使用华硕的主板,CPU 是INTEL。同样可能联想 又会是不同的配置。那么 华硕的本子,戴尔的本子,联想的本子(工厂)都生产产品(产品是主板和CPU)。但是对于这些产品的具体要求不一样(对于产品的具体实现类的要求不一样)那么我们就需要再抽象一层,将工厂继续抽象,所有的工厂都继承一个抽象工厂接口,这个工厂接口里包含有创建主板和CPU的方法,但不实现,具体的实现交给他的实现类。例如 DellFactory,ASUSFactory,LenovoFactory 当然你可以把DellFactory写成DellComputer 这样更好。在这些具体的工厂里实现化具体的产品类,例如DellFactory 里的工厂方法 IBoard GetBoard() 你可以返回 一个 微星主板的实例 return new MSBoard() ;
      

  5.   

    尽量用通俗易懂的话给你解释:你想要一个产品,你需要让工厂给你生产一个,
    你要告诉工厂,你要生产什么产品,就把你需要生产的这个产品,
    当做参数,传给工厂类的生产产品的方法,然后根据你传进来的产品,
    而决定工厂人生产什么产品(一般用switch case语句判断);
    产生出来产品后,最后要返回您要的这个东西;这样你和工厂这个操作就圆满完成.
      

  6.   

    尽量用通俗易懂的话给你解释:你想要一个产品,你需要让工厂给你生产一个,
    你要告诉工厂,你要生产什么产品,就把你需要生产的这个产品,
    当做参数,传给工厂类的生产产品的方法,然后根据你传进来的产品,
    而决定工厂人生产什么产品(一般用switch case语句判断);
    产生出来产品后,最后要返回您要的这个东西;这样你和工厂这个操作就圆满完成.
      

  7.   

    这个讲得很详细噢 ..本人觉得还蛮好的呢.http://www.cnblogs.com/bit-sand/archive/2008/01/31/abstract_factory.html
      

  8.   

    工厂模式有以下几种形态:简单工厂(Simple Factory)模式 
    工厂方法(Factory Method)模式 
    抽象工厂(Abstract Factory)模式
     Simple Factory模式根据提供给它的数据,返回几个可能类中的一个类的实例。通常它返回的类都有一个公共的父类和公共的方法。Simple Factory模式实际上不是GoF 23个设计模式中的一员。
      

  9.   

    Pet Shop 4模式
    http://download.csdn.net/source/831678
      

  10.   

    这么看来,这是一个常用的设计模式,象NET 中的 XmlReader XmlWriter 等都是
      

  11.   

    工厂方法模式与简单工厂模式工厂方法模式与简单工厂模式再结构上的不同不是很明显。工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口,或者有共同的抽象父类。当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了"开放-封闭"原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。工厂方法模式退化后可以演变成简单工厂模式。五、 Factory Method模式演化抽象工厂角色和抽象场频角色都可以选择由接口或抽象类实现。抽象工厂角色可以规定出多于一个的工厂方法,从而使具体工厂角色实现这些不同的工厂方法,这些方法可以提供不同的商业逻辑,以满足提供不同的产品对象的任务。工厂方法总是调用产品类的构造函数以创建一个新的产品实例,然后将这个实例提供给客户端。而在实际情形中,工厂方法所做的事情可以相当复杂。一个常见的复杂逻辑就是循环使用产品对象。工厂对象将已经创建过的产品登记到一个聚集中,然后根据客户所请求的产品状态,向聚集查询。如果有满足要求的产品对象,就直接将产品返回客户端;如果聚集中没有这样的产品对象,那么就创建一个新的满足要求的产品对象,然后将这个对象登记到聚集中,再返还给客户端。"享元模式(Flyweight Pattern)"就是这样一个模式。一个工厂方法模式的实现依赖于工厂角色和产品角色的多态性。在有些情况下,这个模式可以出现退化。工厂方法返回的类型应当是抽象类型,而不是具体类型。调用工厂方法的客户端应当依赖抽象产品编程,而不是具体产品。如果工厂仅仅返回一个具体产品对象,便违背了工厂方法的用意,发生退化,这时就不再是工厂模式了。工厂的等级结构:工厂对象应当有一个抽象的超类型。如果等级结构中只有一个具体工厂类的话,抽象工厂就可以省略,发生了退化。六、 Factory Method模式与其它模式的关系与工厂方法模式有关的模式还包括:模板方法模式、MVC模式、享元模式、备忘录模式七、 另外一个例子// Factory Method pattern -- Real World example   using System;using System.Collections;// "Product"abstract class Page{}// "ConcreteProduct"class SkillsPage : Page{}// "ConcreteProduct"class EducationPage : Page{}// "ConcreteProduct"class ExperiencePage : Page{}// "ConcreteProduct"class IntroductionPage : Page{}// "ConcreteProduct"class ResultsPage : Page{}// "ConcreteProduct"class ConclusionPage : Page{}// "ConcreteProduct"class SummaryPage : Page{}// "ConcreteProduct"class BibliographyPage : Page{}// "Creator"abstract class Document{   // Fields   protected ArrayList pages = new ArrayList();   // Constructor   public Document()   {     this.CreatePages();   }   // Properties   public ArrayList Pages   {     get{ return pages; }   }   // Factory Method   abstract public void CreatePages();}// "ConcreteCreator"class Resume : Document{   // Factory Method implementation   override public void CreatePages()   {     pages.Add( new SkillsPage() );     pages.Add( new EducationPage() );     pages.Add( new ExperiencePage() );   }}// "ConcreteCreator"class Report : Document{   // Factory Method implementation   override public void CreatePages()   {     pages.Add( new IntroductionPage() );     pages.Add( new ResultsPage() );     pages.Add( new ConclusionPage() );     pages.Add( new SummaryPage() );     pages.Add( new BibliographyPage() );   }}/**//// <summary>///   FactoryMethodApp test/// </summary>class FactoryMethodApp{   public static void Main( string[] args )   {     Document[] docs = new Document[ 2 ];     // Note: constructors call Factory Method     docs[0] = new Resume();     docs[1] = new Report();     // Display document pages     foreach( Document document in docs )     {       Console.WriteLine( " " + document + " ------- " );       foreach( Page page in document.Pages )         Console.WriteLine( " " + page );     }   }}