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

本文介绍了设计模式中的抽象工厂模式,对比了它与简单工厂模式和工厂方法模式的区别。抽象工厂模式适用于创建多个产品结构中的产品族,提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。通过示例代码解析了抽象工厂模式的角色及其职责,强调了其在应对产品等级结构变化中的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     前面学习了简单工厂模式,工厂方法模式,并且通过实例知道了他们的应用情景和优缺点。于此回顾一下:

     简单工厂模式:

                    一个工厂负责所有类的对象的创建,不支持无缝的新增类的类型对象的创建,不符合高内聚的

             原则.(可以通过反射机制)改良一下。

     工厂方法模式:

                   多个工厂负责多个产品对象的创建,每个工厂只负责具体类型对象的创建,支持无缝新增类型

         对象的创建,符合高内聚原则,需要实现工厂接口类和产品接口类。但是,会照成工厂类太多,难以维护.

         既然知道了简单工厂模式,工厂方法模式的一些不足,如何进行改进、克服呢?这就要使用抽象工厂模式

         了。

                 通过前面的学习,我们知道每一个设计模式都是针对一定问题的解决方案,工厂方法模式针对的是一个

          产品等级结构,而抽象工厂模式则针对的是多个产品等级结构。

                在学习抽象工厂模式之前首先要理解产品族的概念:

              所谓产品族,是指位于不同的产品等级结构,功能相关联的产品家族。如图:

                 由图可以看出,图中一共有三个产品族,分布于三个不同的产品结构中。若要确定一个产品则必须指明

       它所在的产品族和所处的等级结构

                 所谓的抽象工厂模式就是处于工厂等级结构中的一个具体的工厂,可以创建出分属于不同产品结构的

       一个产品族的所有的对象。如上图所示。从这点就可以看出抽象工厂和工厂方法模式的区别所在了,工厂

       方法模式的具体工厂类只能创建一个对象,而抽象工厂模式可以创建多个对象。

                 那么,抽象工厂模式到底是如何工作的呢?首先看看其类图结构吧。

                       

                 类图中所描述的产品族结构可以表示如下:

           那么抽象工厂有哪些角色组成呢?其实抽象工厂模式和工厂方法模式的组成角色类似,只是各个角色具体完成

的功能可能会略有区别而已。角色组成及作用如下:

            抽象工厂角色:

                    是模式的核心部分,与应用程序的逻辑是无关的。

            具体工厂角色:

                   用于创建产品的实例,并且含有如何创建该产品对象的逻辑,与应用程序功能密切相关。

            抽象产品角色:

                   具体工厂所能创建的对象的父类,或则是他们共同拥有的接口。

             具体产品角色:

                    真正的完成应用程序的逻辑功能的部分,继承或实现抽象产品角色。

       看一下例子程序代码:(根据的上面的类结构图,个命名并没有实际含义)

             抽象工厂类:

package com.kiritor;
/**抽象工厂类*/
public interface AbstractFactory {
    public AbstractProductA createProductA();
    public AbstractProductB createProductB();
}
            具体工厂类:
package com.kiritor;
/**用于创建一号类型的产品族的工厂*/
public class Factory1 implements AbstractFactory {
	@Override
	public AbstractProductA createProductA() {
		// TODO Auto-generated method stub
		return new ProductA1();
	}

	@Override
	public AbstractProductB createProductB() {
		// TODO Auto-generated method stub
		return new ProductB1();
	}
}


/**用于创建二号类型的产品族的工厂*/
package com.kiritor;

public class Factory2 implements AbstractFactory{
	@Override
	public AbstractProductA createProductA() {
		// TODO Auto-generated method stub
		return new ProductA2();
	}
	@Override
	public AbstractProductB createProductB() {
		// TODO Auto-generated method stub
		return new ProductB2();
	}

}

               抽象产品:
package com.kiritor;
/**抽象产品*/
public abstract class AbstractProductA {
   private String name ;
   public String getName()
   {
	   return this.name;
   }
}

package com.kiritor;
/**抽象产品*/
public abstract class AbstractProductB {
	private String name;

	public String getName() {
		return name;
	}

}


              具体产品:
package com.kiritor;

public class ProductA1 extends AbstractProductA{

}

package com.kiritor;

public class ProductA2 extends AbstractProductA{

}


package com.kiritor;

public class ProductB1 extends AbstractProductB{

}

package com.kiritor;

public class ProductB2 extends AbstractProductB{

}

               通过实例代码,可以看到工厂方法模式和抽象方法模式有很多地方相同的,只是在具体工厂的实现上

  不同 ,那么两者的区别组要是什么呢?

              理解了上述代码结构不难发现,工厂方法模式可以看成是抽象方法模式的一种特例,工厂方法模式是创建

  一个产品结构的,而抽象工厂模式是用来创建多个产品结构的。一般说来工厂方法只有一个产品抽象类,而抽

  象工厂有多个产品抽象类。工厂方法模式中的工厂具体类只能创建一类产品类对象,而抽象工厂模式的具体工

  厂可以创建多个产品类的实例。

           

### 抽象工厂模式概述 抽象工厂模式是一种创建型设计模式,其核心在于提供了一种方式来创建一系列相关或相互依赖的对象,而不必指定它们的具体类[^2]。通过这种方式,客户端能够使用统一的接口来获取所需的产品实例,从而降低了系统组件之间的耦合度。 #### 模式的结构与工作原理 该模式主要由四个部分组成: - **抽象工厂(Abstract Factory)**:定义了一个用于创建一族具体产品对象的方法集合。 - **具体工厂(Concrete Factory)**:实现了抽象工厂所声明的操作,负责生产特定种类的产品系列。 - **抽象产品(Abstract Product)**:为每一种可能被生产的物品定了通用接口。 - **具体产品(Concrete Product)**:实际要创建出来的实体类,继承自相应的抽象产品并实现功能。 当客户请求某个类型的对象时,会调用相应工厂里的方法得到想要的结果;由于整个过程中只涉及到高层模块对于低层模块的引用(即仅知道如何操作抽象级别的成员),因此即使内部逻辑发生变化也不会影响到外部使用者。 #### 应用场景分析 此模式非常适合应用于以下情况: - 当应用程序存在多个可互换的产品线,并希望保持独立性以便于扩展新特性时不破坏现有代码; - 需要在运行期间动态决定应该采用哪一套计方案来进行构建; - 要求确保同一版本下的各个组成部分始终一致地协同运作。 例如,在图形库中可以根据不同的渲染引擎选择合适的形状绘制器(如OpenGL vs DirectX)。再比如操作系统风格切换工具里根据不同主题调整窗口控件外观等都是很好的例子。 #### Java实现案例展示 下面给出一段简单的Java代码片段用来说明上述概念的应用: ```java // 定义两个层次的产品接口 public interface GUIFactory { Button createButton(); } public interface Button { void paint(); } ``` 接着分别针对Windows和MacOS平台定制化各自的GUI元素: ```java // Windows风格按钮 class WinButton implements Button { public void paint() { System.out.println("Render a button in the Windows style."); } } // MacOS风格按钮 class MacButton implements Button { public void paint() { System.out.println("Render a button in the macOS style."); } } ``` 最后建立对应的工厂类完成最终组装: ```java // 创建适用于Windows系统的UI部件制造者 class WinFactory implements GUIFactory { @Override public Button createButton() { return new WinButton(); } } // 创建适用于macOS系统的UI部件制造者 class MacFactory implements GUIFactory { @Override public Button createButton() { return new MacButton(); } } ``` 这样就可以很容易地根据当前环境配置选取适当的主题样式了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值