(Abstract Factory)抽象工厂模式的Java实现

简介:
抽象工厂模式( Abstract Factory ):为创建一组相关或者互相依赖的对象提供一个接口,而无需指定它们对应的具体类。

通用类图如下:

例如,我们现在有两种产品 AB,而产品AB分别都有两个厂商12进行生产,在这里我们把不同的厂商1、厂商2理解为牌子1和牌子2,那么厂商1就生产A1B1,厂商2生产A2B2

此时,不同的厂商肯定要生产自己的产品(如A1B1),每个厂商都有自己的一系列产品,这就与上面抽象工厂模式的描述类似了。

该例子的类图如下:
具体代码实现如下:

//定义不同的产品之间的一定具备的标准,用 interface实现 
//其中的method()方法可看作提取出不同产品的共性,如手机都有类似的功能 
interface IProductA{ 
   public  void method(); 


interface IProductB{ 
   public  void method(); 


//实现了产品标准实现的一系列具体产品 
//由于已经设计好A1由厂商1生产,故以下输出代码有“厂商x” 
class ProductA1  implements IProductA{ 
   public  void method() { 
    System.out.println( "厂商1    生产ProductA1 ..."); 
  } 


class ProductA2  implements IProductA{ 
   public  void method() { 
    System.out.println( "厂商2    生产ProductA2 ..."); 
  } 


class ProductB1  implements IProductB{ 
   public  void method() { 
    System.out.println( "厂商1    生产ProductB1 ..."); 
  } 


class ProductB2  implements IProductB{ 
   public  void method() { 
    System.out.println( "厂商2    生产ProductB2 ..."); 
  } 


//每一种牌子的产品生产工厂,即不同的厂商负责自己牌子产品的生产 
abstract  class Factory1{ 
   abstract IProductA getProductA1(); 
   abstract IProductB getProductB1(); 


abstract  class Factory2{ 
   abstract IProductA getProductA2(); 
   abstract IProductB getProductB2(); 


//具体的工厂用来生产相关的产品 
class ConcreteFactory1  extends Factory1{ 
   public IProductA getProductA1() { 
     return  new ProductA1(); 
  } 
   public IProductB getProductB1() { 
     return  new ProductB1(); 
  } 


class ConcreteFactoryB  extends Factory2{ 
   public IProductA getProductA2() { 
     return  new ProductA2(); 
  } 
   public IProductB getProductB2() { 
     return  new ProductB2(); 
  } 


//测试类 
public  class Client { 
   public  static  void main(String[] args) { 
     //厂商1负责生产产品A1、B1 
    Factory1 factory1 =  new ConcreteFactory1(); 
    IProductA productA1 = factory1.getProductA1(); 
    IProductB productB1 = factory1.getProductB1(); 
     
    productA1.method(); 
    productB1.method(); 
     
     //厂商2负责生产产品A2、B2 
    Factory2 factory2 =  new ConcreteFactoryB(); 
    IProductA productA2 = factory2.getProductA2(); 
    IProductB productB2 = factory2.getProductB2(); 
     
    productA2.method(); 
    productB2.method(); 
  } 
}

运行结果:

厂商1  生产ProductA1 ...

厂商1  生产ProductB1 ...

厂商2  生产ProductA2 ...

厂商2  生产ProductB2 ...

 
其实,上例中本来可以不用到了两个抽象工厂,只剩一个也可,但是这样子与我们现实生活中不同厂商各自生产自己的产品有点不同,所以就将其分开为两个了,也就是将两个厂商完全地分离开。

由上面类图可以知道,一旦任何一个厂商开发出了产品C的话,那么这个厂商肯定需要扩展自己的工厂来投入到C产品的生产中,那么此时工厂1和工厂2就需要进行一定的改变了,这很明显不符合开闭原则。


本文转自 xxxx66yyyy 51CTO博客,原文链接:http://blog.51cto.com/haolloyin/332802,如需转载请自行联系原作者
相关文章
|
4月前
|
Java
Java(二十)abstract抽象类
Java(二十)abstract抽象类
24 0
|
4月前
|
设计模式 Java
java工厂模式和抽象工厂模式的区别是什么?
java工厂模式和抽象工厂模式的区别是什么?
67 1
|
4月前
|
设计模式 Java
Java设计模式【三】:抽象工厂模式
Java设计模式【三】:抽象工厂模式
18 0
|
19天前
|
设计模式 Java Windows
23种设计模式,抽象工厂模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】抽象工厂模式是一种创建型设计模式,它提供了一个接口用于创建相关或依赖对象的家族,而不需要指定具体类。该模式允许客户端在不知道具体类的情况下,通过其共同的接口来创建一组产品。
27 7
|
1月前
|
Java
Java——abstract类和方法
Java——abstract类和方法
9 0
|
5月前
|
Java
JAVA 抽象类(Abstract Class) 和 接口(Interface) 的区别
对于面向对象编程来说,抽象是它的一大特征之一。在 Java 中,可以通过两种形式来体现 OOP 的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的地方。今天我们就一起来学习一下Java中的接口和抽象类抽象类不能用于实例化对象,抽象类往往用来表示抽象概念。举个例子,中国人(Chinese 类)和美国人(American 类)都有“吃饭”这个行为,因此可以先定义一个 Person 类,然后让 Chinese 和 American 都继承这个类。但如何在父类 Person 中定义“吃饭”这个方法呢?一般
74 0
|
2月前
|
设计模式 算法 Java
Java 中的abstract:抽象世界的奥秘
Java 中的abstract:抽象世界的奥秘
30 0
|
8月前
|
设计模式 Java 数据库连接
Java设计模式之抽象工厂模式:创造多个相关对象
在软件开发领域,设计模式是一种用于解决常见问题的实践方法,它提供了一些被验证过的指导原则。抽象工厂模式是创建型设计模式中的佼佼者,可以帮助我们在处理多个相关对象的创建时保持一致性。让我们深入了解抽象工厂模式的内涵以及它如何在Java中应用。
61 0
|
4月前
|
Rust Java
抽象工厂模式 rust和java的实现(二)
抽象工厂模式 rust和java的实现
35 0
|
4月前
|
Rust Java uml
抽象工厂模式 rust和java的实现(一)
抽象工厂模式 rust和java的实现
33 0