`
anson_xu
  • 浏览: 514663 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类

抽象工厂模式-与-工厂方法模式区别

阅读更多

  抽象工厂模式-与-工厂方法模式区别 收藏

<script type="text/javascript"></script><script type="text/javascript"></script>
厂方法UML图:

抽象工厂UML图:


---------------------------------
对于java来说,你能见到的大部分抽象工厂模式都是这样的:
它的里面是一堆工厂方法,每个工厂方法返回某种类型的对象。

比如说工厂可以生产鼠标和键盘。那么抽象工厂的实现类(它的某个具体子类)的对象都可以生产鼠标和键盘,但可能工厂A生产的是罗技的键盘和鼠标,工厂B是微软的。

这样A和B就是工厂,对应于抽象工厂;
每个工厂生产的鼠标和键盘就是产品,对应于工厂方法;

用了工厂方法模式,你替换生成键盘的工厂方法,就可以把键盘从罗技换到微软。但是用了抽象工厂模式,你只要换家工厂,就可以同时替换鼠标和键盘一套。如果你要的产品有几十个,当然用抽象工厂模式一次替换全部最方便(这个工厂会替你用相应的工厂方法)

所以说抽象工厂就像工厂,而工厂方法则像是工厂的一种产品生产线
---------------------------------
“抽象工厂”模式依赖于“工厂方法”模式的。因此,抽象工厂强调的是前面的动词“抽象”,也就是说,你将工厂方法模式中的工厂方法抽象出来的那个"动作或设计"就是“抽象工程”模式了。
---------------------------------
factory method针对的是一个产品等级结构  
abstract factory是面向多个产品等级结构的
---------------------------------
工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。 
                              一个抽象工厂类,可以派生出多个具体工厂类。 
                              每个具体工厂类只能创建一个具体产品类的实例。 
抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 
                              一个抽象工厂类,可以派生出多个具体工厂类。 
                              每个具体工厂类可以创建多个具体产品类的实例。 
  
区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
      工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
---------------------------------
   1.如果一个后花园只种蔬菜类,那么就用简单工厂就可以了.
   2.如果后花园蔬菜品种繁多.得用工厂方法才可以,把共有的东西抽象出来.
   3.如果要扩大后花园的规模,比如一个在北方,一个在南方,这样工厂方法就无法实现了,就应当用抽象工厂,把各种各样的植物,又组成一个后花园.
所以我个人认为,简单工厂是一个工厂只生产一类的产品,面对的是具体的类,工厂方法是可以生产不同的产品,把公共的方法抽象出来,然后进行创建各种各样的产品.抽象工厂把几种产品划出共同的东西,把相互依赖的对象抽象出来,只要实现这些接口就可以得到不同的产品.
具体例子:
1.简单工厂:

using System; 
public interface
 ICar 

     
void
 run(); 


public class
 BMWCar : ICar 

     
public void
 run() 
     { 
         Console.WriteLine(
"BMWCar run"
); 
     } 


public class
 BenzCar : ICar 

     
public void
 run() 
     { 
         Console.WriteLine(
"BenzCar run"
); 
     } 


public class
 Driver 

     
public static ICar DriverCar(string
 carType) 
     { 
         
switch
 (carType) 
         { 
             
case "BMWCar"return new
 BMWCar(); 
             
case "BenzCar"return new
 BenzCar(); 
             
defaultthrow new
 Exception(); 
        } 
     } 


public class
 Client 

     
public static void
 Main() 
     { 
         ICar myCar 
= Driver.DriverCar("BenzCar"
); 
         myCar.run(); 
         Console.Read(); 
     } 
}

心得:优点是只要实现共有的接口就可以实现不同车跑的方式.但缺点就是要判断哪一种车,造成要修改Driver 类
2.工厂方法:
using System; 
public interface
 ICar 

     
void
 run(); 


public class
 BMWCar : ICar 

     
public void
 run() 
     { 
         Console.WriteLine(
"BMWCar run"
); 
     } 


public class
 BenzCar : ICar 

     
public void
 run() 
     { 
         Console.WriteLine(
"BenzCar run"
); 
     } 

public abstract class
 Driver 

     
public abstract
 ICar DriverCar(); 


public class
 BMWDriver : Driver 

     
public override
 ICar   DriverCar() 
     { 
         
return new
 BMWCar(); 
     } 


public class
 BenzDriver : Driver 

     
public   override
 ICar DriverCar() 
     { 
         
return new
 BenzCar(); 
     } 


class
 Client 

     
public static void
 Main() 
     { 
         Driver myDriver 
= new
 BenzDriver(); 
         ICar myCar 
=
 myDriver.DriverCar(); 
         myCar.run(); 
         Console.Read(); 
     } 
}

心得:优点是符合了开放-封闭原则(OCP),从整体上还看不出什么缺点.

3.抽象工厂:

using System; 

public interface
 IBusinessCar 

     
void
 run(); 


public interface
 ISportCar 

void
 run(); 


public class
 BMWBusinessCar : IBusinessCar 

     
public void
 run() 
     { 
         Console.WriteLine(
"BMWCar run"
); 
     }

}

public class
 BenzBusinessCar : IBusinessCar 

     
public void
 run() 
     { 
         Console.WriteLine(
"BenzBusinessCar run"
); 
     } 


public class
 BMWSportCar:ISportCar 

public void
 run() 

Console.WriteLine(
"BMWSportCar run"
); 



public class
 BenzSportCar:ISportCar 

public void
 run() 
{

Console.WriteLine(
"BenzSportCar run"
); 



public interface
 IDriver 

IBusinessCar BusinessCarDriver(); 
ISportCar SportCarDriver(); 


public class
 BMWDriver:IDriver 

public
 IBusinessCar BusinessCarDriver() 

return new
 BMWBusinessCar(); 

public
 ISportCar SportCarDriver() 

return new
 BMWSportCar(); 



public class
 BenzDriver:IDriver 

public
 IBusinessCar BusinessCarDriver() 

return new
 BenzBusinessCar(); 


public
 ISportCar SportCarDriver() 

return new
 BenzSportCar(); 

}


class
 Client 

     
public static void
 Main() 
     { 
         IDriver myDriver 
=new
 BenzDriver(); 
         ISportCar myCar 
=
 myDriver.SportCarDriver(); 
         myCar.run(); 
         Console.Read(); 
     }

}
分享到:
评论

相关推荐

    简单工厂模式-工厂方法模式-抽象工厂模式

    在软件设计模式中,工厂模式是一组非常基础且实用的设计模式,主要分为简单工厂模式、工厂方法模式和抽象工厂模式。这些模式都是为了解决对象创建的问题,通过封装对象的创建过程,使得代码更加灵活,易于扩展和维护...

    设计模式专题之(三)抽象工厂模式---设计模式抽象工厂模式示例代码(python--c++)

    设计模式专题之(三)抽象工厂模式---设计模式抽象工厂模式示例代码(python--c++)

    抽象工厂模式--演示代码

    抽象工厂模式是设计模式中的一种,属于创建型模式。它提供了一个创建对象族的接口,而无需指定其具体的类。这种模式的关键在于“家族”这个概念,即一系列相关的对象,它们可以相互协作以完成特定任务。在Java中,...

    工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式

    工厂模式分为三种主要类型:简单工厂模式、工厂方法模式和抽象工厂模式。 1. **简单工厂模式** 简单工厂模式是最简单的工厂模式实现,它提供一个静态方法或者类来创建对象,这个类通常被称为“工厂”。用户只需要...

    工厂方法模式和抽象工厂模式的区别

    与工厂方法模式相比,抽象工厂模式更进一步,它提供了创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。在抽象工厂模式中,不只一个产品类被创建,而是有一组相关的产品类。这种模式适用于当系统需要...

    简单工厂-工厂方法-抽象工厂 对比总结

    **抽象工厂模式** 是工厂方法模式的进一步抽象和推广,它关注的是整个一族相关或相互依赖的对象。抽象工厂提供了一组接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。这个模式适用于当系统需要...

    抽象工厂模式 - PHP版

    抽象工厂模式是一种高级的设计模式,属于创建型模式,它提供了一种创建对象族的方法,而无需指定其具体的类。在PHP中,抽象工厂模式尤其适用于那些需要创建一系列相关或相互依赖的对象,而又不希望硬编码具体类名的...

    设计模式-抽象工厂模式(讲解及其实现代码)

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象集合的接口,而无需指定具体的类。这种模式允许系统独立于如何创建、组合和表示产品对象的细节进行设计,为产品族(一组相关或相互依赖的对象)提供...

    抽象工厂模式 - 代码(Java)

    抽象工厂模式是一种设计模式,属于创建型模式,它提供了一种创建对象集合的接口,而无需指定具体类。这种模式的关键在于,它允许在运行时创建一个产品家族,这些产品都属于同一类别,但可能有不同的实现。在Java中,...

    2 抽象工厂模式-课程内容.rar

    6. **关联模式**:抽象工厂模式通常与工厂方法模式、简单工厂模式、单例模式等其他创建型模式结合使用,以提供更灵活的解决方案。 7. **实际应用**:在Java的Swing和AWT库中,就使用了抽象工厂模式,根据不同的平台...

    【熵增学院VIP精品课程录播】简单工厂模式-工厂方法模式-抽象工厂模式

    熵增教育-熵增学院VIP精品课程录播:简单工厂模式-工厂方法模式-抽象工厂模式

    设计模式 - 抽象工厂模式

    抽象工厂模式的核心是提供一个抽象的工厂接口,该接口定义了一组用于创建产品的方法,而不需要指定具体的类。具体的工厂类继承该接口,并实现了这些方法以创建具体的产品。 抽象工厂模式的优点包括: * decoupling...

    设计模式之抽象工厂模式-c++

    抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,提供一个接口用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。这种模式常用于需要跨多个产品系列进行实例化的场景。 抽象工厂模式的...

    设计模式--抽象工厂模式实现多数据库连接

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一个创建对象族的接口,而无需指定它们的具体类。在.NET开发中,这种模式常用于实现多数据库连接,比如连接到MySQL、SQL Server或Oracle等不同的数据库系统。...

    设计模式-抽象工厂模式

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象族的接口,而无需指定其具体的类。这种模式的关键在于“族”,即一系列相关的对象。在抽象工厂模式中,我们创建一个抽象工厂接口,然后为每一种具体...

    抽象工厂模式+工厂方法模式+策略模式+类图实现手机加工厂

    本文将探讨三个重要的设计模式:抽象工厂模式、工厂方法模式以及策略模式,并结合一个实际的场景——手机加工厂,来具体阐述它们的应用。 首先,我们来看**抽象工厂模式**。这个模式主要用于创建相关或依赖对象的...

    java设计模式-抽象工厂模式

    抽象工厂模式是设计模式中的一种,它属于创建型模式,主要解决的是当系统有多个产品族,而每个产品族又有多个具体产品时,如何组织代码的问题。在Java中,抽象工厂模式提供了一种创建对象组的方式,使得这些对象属于...

    java抽象工厂模式实例----手机工厂

    抽象工厂模式是软件设计模式中的一种,属于创建型模式,它的主要目的是提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。在Java编程中,这个模式经常被用来实现跨平台或者不同品牌产品的一致性...

    抽象工厂模式-多库05.rar_Windows编程

    抽象工厂模式是设计模式中的一种,它在软件工程中用于提供一种创建对象的接口,使得创建过程更加灵活,同时也能够确保在不同的环境或平台下创建的对象具有正确的组合。在这个"抽象工厂模式-多库05.rar"压缩包中,...

    工厂方法模式和抽象工厂模式

    工厂方法模式与抽象工厂模式的主要区别在于: 1. **复杂度**:工厂方法模式只关注一个产品的创建,而抽象工厂模式关注的是一个产品族的创建。 2. **灵活性**:工厂方法模式允许子类决定实例化哪个类,提供了更大的...

Global site tag (gtag.js) - Google Analytics