首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式----抽象工厂模式

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

作者头像
SuperHeroes
发布2018-05-30 17:09:25
4160
发布2018-05-30 17:09:25
举报
文章被收录于专栏:云霄雨霁云霄雨霁

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

抽象工厂模式:

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

抽象工厂模式是工厂方法模式的升级版本。如果我们要实现的系统有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();
         ...
     }
}
  • 优点:封装性----高层模块不需要知道每个产品的实现类,它只关心接口/抽象类。各种对象的创建由工厂类负责。工厂类就是一个对象工厂,我们需要什么对象只需让它生产一个即可。
  • 缺点:产品族的扩展非常麻烦。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.11.05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档