`

工厂模式与抽象工厂联系和区别

 
阅读更多

工厂模式和抽象工厂模式都是创建型模式,工厂模式可以延迟类的实例化,而抽象工厂可以增加对象创建的灵活性和降低耦合。

 

简单工厂:具体工厂类 一个静态方法 接收不同的参数返回不同的对象(不符合ocp原则)
工厂方法:抽象工厂类 一个纯虚方法 每一个子类工厂返回一种对象 (符合ocp原则)
抽象工厂:抽象工厂类 多个纯虚方法 每一个子类工厂返回一系列不同对象 (符合ocp原则)

 

简单工厂:严格说并不是一个设计模式。简单工厂没有抽象类,只有一个具体工厂类如MyFactory,然后MyFactory里面有个工厂方法CreateProduct返回一个基类产品,具体返回什么具体实例通过传入参数然后用case判断。

用手机生产做个例子:

比如Nokia简单工厂就是只有NokiaFactory工厂类,工厂方法就是CreateNokiaPhone,参数是Nokia手机型号,根据不同型号创建不同的Nokia手机(使用case)。很明显的缺点就是Nokia每发明一个新型号的手机都需要修改简单工厂类(增加case判断),违反了封闭修改,开放扩展原则

工厂方法:该模式有一个抽象基类和若干个派生的具体工厂类,基类定义了一个虚工厂方法返回指定产品类的基类,派生类需要实现该虚方法并创建具体产品类返回。注意工厂方法的每个具体工厂只负责返回一种产品类。

同样以手机生产做例子:

Nokia工厂方法模式有一个工厂基类NokiaFactory,注意此工厂和上面不一样,是抽象的。该类定义一个虚工厂方法CreateNokiaPhone,该方法返回NokiaPhone基类。然后不同型号的手机对应一个该型号的手机工厂,比如N97Factory,注意此工厂派生于NokiaFactory基类,N97Factory实现虚工厂方法,它返回值是具体的Nokia手机类,如new N97Phone。(注意N97Phone是NokiaPhone的派生类)这样的优点就是,新出一个Nokia手机型号,只需派生一个该型号的工厂而无需修改原来的代码。符合封闭修改,开放扩展原则

抽象工厂:该模式和工厂方法模式很相似,也是一个抽象基类和若干个具体工厂类,不同的是抽象工厂的工厂基类定义了多个虚工厂方法每个虚工厂方法负责返回一种产品,多个工厂方法返回多种产品,并且这些产品具有某些联系

抽象工厂就不止生产Nokia手机了,还生产相关的周边产品,首先NokiaFactory基类会定义两个虚方法,一个是CreateNokiaPhone用来生产手机,另一个是CreateNokiaCharger用于生产对应型号的手机充电器(假定不同型号手机使用不同的充电器)。然后派生类N97Factory就要生产两种相关的产品,一个是N97Phone,还有一个是N97Charger,这两个对象是对应的关系,因此封装到抽象工厂来生产一系列相关的对象

总结:用最简单的话来概括就是,简单工厂只有一个具体工厂类来创建一种基类的多个不同派生类,工厂方法就是有多个派生于一个基类的具体工厂类,每个具体工厂只生产一种基类的一个派生类,抽象工厂也是只有一个工厂基类,但是每个具体工厂生产多个相关基类的各一个派生类。

 

 

工厂模式(包含有的角色或者说类)

 

1)        工厂类角色:这是本模式的核心,负责具体产品角色的创建。

2)        抽象产品角色:它一般是具体产品继承的父类或者实现的接口。由接口或者抽象类来实现。

3)        具体产品角色:工厂类所创建的对象就是此角色的实例。由一个具体类实现。

 

抽象工厂模式(包含有的角色或者说类):

 

1)        抽象工厂角色: 这是工厂方法模式的核心,是对具体工厂的抽象,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。

2)        具体工厂角色:负责具体产品角色的创建。

3)        抽象产品角色:它是具体产品继承的父类或者是实现的接口。一般有抽象类或者接口来实现。

4)        具体产品角色:具体工厂角色所创建的对象就是此角色的实例。由具体的类来实现。

 

区别和联系:

  • 工厂模式和抽象工厂都会有“具体产品角色”CarA 

public class CarA implements Car{

public void drive()  {

System.out.println("Driving Benz ");

}

和抽象产品角色Car

public interface Car{

public void drive(); 

}
  • 工厂模式只有一个具体工厂角色负责生成具体产品角色

public class Driver{

//工厂方法.注意 返回类型为抽象产品角色
       public static Car driverCar(String s)throws Exception    {

              //判断逻辑,返回具体的产品角色给Client
              if(s.equalsIgnoreCase("Benz"))  

                    return new Benz();

              else if(s.equalsIgnoreCase("Bmw"))

                     return new Bmw();

                    ......   

 

  • 工厂模式的实现后的调用

Car car = Driver.driverCar("benz"); 
                     //
下命令:开车
                   
                     car.drive();

  • 抽象工厂模式有一个抽象工厂角色,是对工厂的抽象,把上面driverCar方法抽象到抽象工厂类中

public interface Driver{
       public Car driverCar();
}
public class BenzDriver implements Driver{
       public Car driverCar(){
              return new Benz();
       }
}
public class BmwDriver implements Driver{
       public Car driverCar()   {

 

return new Bmw(); 
       }
}

  • 抽象工厂模式实现后的调用

    Driver driver = new BenzDriver(); //Driver 就是抽象工厂类

             Car car = driver.driverCar(); 

             car.drive();

分享到:
评论

相关推荐

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

    工厂方法模式和抽象工厂模式是两种常见的设计模式,它们都属于创建型模式,用于解决对象的创建问题。在软件设计中,这两种模式都是用来隔离对象的创建和使用,以提高系统的灵活性和可扩展性。 首先,工厂方法模式的...

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

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

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

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

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

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

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

    本篇文章将对三种主要的工厂模式:简单工厂、工厂方法和抽象工厂进行深入的对比和总结。 **简单工厂模式** 是最基础的工厂模式形式,它提供一个静态方法或类来创建对象。在这个模式中,工厂是负责创建对象的中心...

    抽象工厂模式uml类图

    java设计模式 抽象工厂模式详解 一张图让你彻底明白抽象工厂模式

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

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

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

    5. 在客户端代码中,使用抽象工厂和抽象产品进行编程,避免与具体实现的耦合。 抽象工厂模式的优势在于: - 提高了系统的灵活性,当需要添加新的产品族时,无需修改原有代码,只需添加新的具体工厂和产品类即可。 -...

    简单工厂模式、工厂模式、抽象工厂模式案例(C++实现)

    在这个压缩包中,包含了三种工厂模式的C++实现:简单工厂模式、工厂方法模式以及抽象工厂模式。让我们一一探讨这些模式。 1. 简单工厂模式: 简单工厂模式是一种静态工厂方法,它提供一个公共的工厂类来创建对象。...

    抽象工厂模式+反射技术(抽象工厂模式+简单工厂模式)

    在软件工程中,当系统需要在运行时选择不同的产品族时,或者想要隔离具体产品的实现细节时,抽象工厂模式就显得尤为重要。 首先,我们来看一下“抽象工厂模式+反射技术”。在Java或其他面向对象的语言中,反射是一...

    探索Java设计模式:工厂模式与抽象工厂模式的比较

    工厂模式和抽象工厂模式是两种常用的创建型设计模式,它们在Java中有着广泛的应用。本文将详细探讨这两种模式的区别,并提供代码示例来加深理解。 工厂模式和抽象工厂模式都是创建型设计模式,它们提供了代码解耦和...

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

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

    设计模式-抽象工厂模式

    在学习和使用抽象工厂模式时,关键是要理解它如何在不同的上下文中应用,以及如何平衡灵活性和封装之间的关系。通过实际的项目练习,如创建一个跨平台的GUI组件库,你可以更好地理解和掌握抽象工厂模式的精髓。

    IOS 设计模式抽象工厂实例Demo

    在iOS开发中,设计模式是解决常见编程问题的模板,它们提供了一种标准的方法来组织代码,使得代码更易于理解、扩展和维护。...通过阅读和理解这些代码,开发者可以深入掌握抽象工厂模式在iOS开发中的实际应用。

    设计模式 - 抽象工厂模式

    设计模式 - 抽象工厂模式 抽象工厂模式是一种创建型设计模式,它提供了一种方式来创建一组相关或相互依赖的对象,而不需要指定具体的类。该模式允许客户端使用抽象的接口来创建一组相关的产品,而不需要关系实际...

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

    - `factory2`、`factory3`、`factory1` 这些文件名可能是实现工厂模式的Java源代码,分别代表了不同级别的工厂类,如简单工厂、工厂方法和抽象工厂的实现。通过查看这些源代码,可以学习到如何在实际项目中应用这些...

    肯德基:抽象工厂模式

    本章要点部分总结了抽象工厂模式的核心概念和设计原则,同时还区分了抽象工厂模式与工厂方法模式的不同,以及抽象工厂模式的具体使用场合。通过本章的学习,我们能够掌握抽象工厂模式的原理和应用,为解决实际开发中...

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

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

    c#工厂模式——简单工厂,抽象工厂,单件模式实例

    C#中的工厂模式分为简单工厂、抽象工厂和单例模式三种,每一种都有其特定的应用场景和优势。 1. **简单工厂模式**: 简单工厂模式是一种静态工厂方法,它创建一个具体的对象而无需暴露创建逻辑。在C#中,我们可以...

    工厂模式(简单工厂,普通工厂,抽象工厂)代码java

    工厂模式分为三种主要类型:简单工厂模式、普通工厂模式(也称为工厂方法模式)和抽象工厂模式。 1. **简单工厂模式**: - 简单工厂模式中,有一个中心工厂类,它负责根据输入条件(通常是一个参数)来创建具体的...

Global site tag (gtag.js) - Google Analytics