当前位置: 代码迷 >> 综合 >> 设计模式----抽象工厂模式
  详细解决方案

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

热度:29   发布时间:2023-09-21 21:51:16.0

上一篇----工厂方法模式

抽象工厂模式:

提供一个接口,用来创建相关或依赖对象的家族,而不需要明确指定具体类。

抽象工厂模式是工厂方法模式的升级版本。如果我们要实现的系统有N个产品族,每个产品族有M种产品,那么就可以使用抽象工厂模式。抽象工厂模式的结构可以分为:

  • 抽象产品类/接口:定义每个产品族的共性特点,有多少个产品族就要定义多少个抽象产品类/接口。
  • 产品实现类:每个具体产品肯定属于某个产品族,它要继承/实现相应的抽象产品类/接口。
  • 抽象工厂类/接口:声明每个产品族的创建方法,有N个产品族,在抽象工厂类中就应该有N个创建方法。
  • 实现工厂类:继承/实现相应的抽象工厂类/接口,实现不同产品族的生产任务。每个产品族有M种产品,就应该有M个实现工厂类。

示例代码如下:

假设我们有两个产品族,那么抽象产品类如下:

//抽象产品类A
public abstract class AbstractProductA { ... }
//抽象产品类B
public abstract class AbstractProductA { ... }   

假设每个抽象产品族生产2中产品,那么产品实现类如下:

//产品族A生产的1级品
public class ProductA1 extends AbstractProductA {public void show() {  System.out.println("产品族A生产的1级品"); }
}
//产品族A生产的2级品
public class ProductA1 extends AbstractProductA {public void show() {  System.out.println("产品族A生产的2级品"); }
}//产品族B生产的1级品
public class ProductA1 extends AbstractProductA {public void show() {  System.out.println("产品族B生产的1级品"); }
}
//产品族B生产的2级品
public class ProductA1 extends AbstractProductA {public void show() {  System.out.println("产品族B生产的2级品"); }
}

有两个产品族,在抽象工厂类中就有两个创建方法:

抽象工厂类
public abstract class AbstractCreator {//创建A产品家族public abstract AbstractProductA createProductA(); //创建B产品家族public abstract AbstractProductB createProductB();
}

在此例中应该有两个实现工厂类,分别生产1级品和2级品:

//产品等级1的实现类
public class Creator1 extends AbstractCreator {    //生产A产品族的1级品public Abstract ProductA createProductA() {  return new ProductA1(); }//生产B产品族的1级品public Abstract ProductB createProductB() {  return new ProductB1(); }
}//产品等级2的实现类
public class Creator2 extends AbstractCreator {    //生产A产品族的2级品public AbstractProductA createProductA() {   return new ProductA2(); }//生产B产品族的2级品public AbstractProductB createProductB() {   return new ProductB2(); }
}

上面就已经实现了抽象工厂设计模式,使用方法如下:

public class MyTest {public static void main(String[] args) {//定义出两个工厂Abstract Creator creator1 = new Creator1();Abstract Creator creator2 = new Creator2();//产生A1对象AbstractProductA a1 =  creator1.createProductA();//产生A2对象AbstractProductA a2 = creator2.createProductA();//产生B1对象AbstractProductB b1 = creator1.createProductB();//产生B2对象AbstractProductB b2 = creator2.createProductB();...}
}
  • 优点:封装性----高层模块不需要知道每个产品的实现类,它只关心接口/抽象类。各种对象的创建由工厂类负责。工厂类就是一个对象工厂,我们需要什么对象只需让它生产一个即可。
  • 缺点:产品族的扩展非常麻烦。
  相关解决方案