工厂方法模式有一个缺点,他的一个工厂只能生产一种产品,那么要解决工厂类爆炸,我们就引入的产品族的概念,产品族就是把产品分类,

比如:

大众的汽车厂只能生产大众的轮子、底盘、引擎
奔驰的汽车厂只能生产奔驰的轮子、底盘、引擎

轮子、底盘、引擎分别就属于不同的产品族(轮子族、底盘族、引擎族)

抽象工厂的模式角色分析:

1. 抽象的各种产品族(产品接口)

2. 集成各种产品族的具体实现类(具体产品)

3. 能生产各种产品族的抽象工厂(工厂接口)

4. 能生产不同品牌产品族的具体工厂(工厂接口的实现类)

上代码:

首先是属于各产品族的接口

轮子接口:

/*** 汽车的轮子*/
public interface Wheel {void run();
}

引擎接口:

/*** 汽车引擎*/
public interface Engine {void work();
}

底盘接口:

/*** 汽车底盘*/
public interface Chassis {void canBuild();}

接下来是实现产品族各种具体的产品:

奔驰的各种产品:

/*** 奔驰的轮子*/
public class BenzWheel implements Wheel{public void run() {System.out.println("我是奔驰的轮子,我转起来超稳");}
}
/*** 奔驰引擎*/
public class BenzEngine implements Engine{public void work() {System.out.println("我是奔驰的引擎,我的工作转速超高");}
}
/*** 奔驰底盘*/
public class BenzChassis implements Chassis{public void canBuild() {System.out.println("我是奔驰的底盘,我能完美组装其他部分");}
}

大众的各种产品:

/*** 大众的轮子*/
public class VWWheel implements Wheel{public void run() {System.out.println("我是大众的轮子,我运行起来比较稳");}
}
/*** 大众引擎*/
public class VWEngine implements Engine{public void work() {System.out.println("我是大众的引擎,我运行的转速比较高");}
}
/*** 大众的底盘*/
public class VWChassis implements Chassis{public void canBuild() {System.out.println("我是大众的地盘,我能比较好的组装其他零件");}
}

接下来是抽象的工厂接口:

public interface CarFactory {Engine createEngine();Wheel createWheel();Chassis createChassis();
}

有了抽象的工厂就要有具体的工厂实现:

奔驰的工厂:


public class BenzFactory implements CarFactory{public Engine createEngine() {return new BenzEngine();}public Wheel createWheel() {return new BenzWheel();}public Chassis createChassis() {return new BenzChassis();}
}

大众的工厂:

public class VWFactory implements CarFactory {public Engine createEngine() {return new VWEngine();}public Wheel createWheel() {return new VWWheel();}public Chassis createChassis() {return new VWChassis();}}

测试一下:

public class AbstractFactoryTest {public static void main(String[] args) {CarFactory carFactory;//首先使用奔驰的工厂创建奔驰的汽车零件carFactory = new BenzFactory();Engine benzEngine = carFactory.createEngine();benzEngine.work();Chassis benzChassis = carFactory.createChassis();benzChassis.canBuild();Wheel benzWheel = carFactory.createWheel();benzWheel.run();//然后使用大众的工厂创建大众的汽车零件carFactory = new VWFactory();Engine vwEngine = carFactory.createEngine();vwEngine.work();Chassis vwChassis = carFactory.createChassis();vwChassis.canBuild();Wheel vwWheel = carFactory.createWheel();vwWheel.run();}}

运行结果:

我是奔驰的引擎,我的工作转速超高
我是奔驰的底盘,我能完美组装其他部分
我是奔驰的轮子,我转起来超稳
我是大众的引擎,我运行的转速比较高
我是大众的地盘,我能比较好的组装其他零件
我是大众的轮子,我运行起来比较稳

从上面的代码看:

抽象工厂节约了资源的浪费,结合现实的想一想,如果使用工厂方法模式去生产零件,那一百个零件就需要一百个工厂类,加入了产品族的概念,我们就会有以下的优势:

1. 定义了某一族产品的规范后,具体产品只要按照规范来生产就好

2. 工厂能生产多种产品,这节约了资源。(这样不会工厂类爆炸),虽然这有点不符合开闭和单一职责,但是防止了类的爆炸

但是会有以下的劣势:

1. 增加一个产品族,抽象工厂就要加一个抽象方法,具体工厂就要实现。违背了开闭原则。

2. 在具体工厂类的方法中,对于产品族里的产品,只能使用其中一个。这也比较容易理解,比如,一款车子不可以搭载两种空调。

Java抽象工厂模式详解相关推荐

  1. 23种设计模式之简单工厂模式,工厂方法模式,抽象工厂模式详解

    工厂模式详解 1. 简单工厂模式 1.1 需求分析 1.2 使用传统方式实现 1.2.1 类图 1.2.2 代码实现 1.2.2.1 新建pizza抽象类 1.2.2.2 希腊披萨实现类 1.2.2. ...

  2. 【设计模式】之抽象工厂模式详解与应用(三)

    开心一刻 [问:"怎么样才能给足男人面子"? 神回复:"露出腿上的淤青啊".] 课程介绍 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工 ...

  3. getinstance方法详解_二、设计模式总览及工厂模式详解

    二.架构师内功心法之设计模式 2.架构师内功心法之设计模式 2.1.课程目标 1.通过对本章内容的学习,了解设计模式的由来. 2.介绍设计模式能帮我们解决哪些问题. 3.剖析工厂模式的历史由来及应用场 ...

  4. 设计模式之工厂模式详解(附应用举例实现)

    文章目录 1 工厂模式介绍 2 工厂模式详解 2.1 简单工厂模式 2.1.1 简单工厂模式结构 2.1.2 简单工厂模式实现 2.1.3 简单工厂模式应用举例 2.2 工厂方法模式 2.2.1 工厂 ...

  5. C++简单工厂模式详解

    C++简单工厂模式详解 1.问题引入 2.编写代码思路的迭代 2.1 main函数主体内编写全部代码 2.2 修改上述问题后的main函数代码 2.3 引入面向对象后的代码 2.4 加上继承和多态后的 ...

  6. Java 静态工厂方法详解

    Java 静态工厂方法详解 本文章主要是对<Effective Java>对静态工厂方法的理解 第一次使用静态工厂方法是在HIT<Software Construction>课 ...

  7. Java工厂模式(简单工厂、工厂方法、抽象工厂)详解

    工厂模式是一种非常常用的创建型设计模式,其提供了创建对象的最佳方式.在创建对象时,不会对客户端暴露对象的创建逻辑,而是通过使用共同的接口来创建对象. 1.工厂模式的理解 1.1.工厂模式的分类 工厂模 ...

  8. java 工厂模式详解_java 工厂模式的实例详解

    java 工厂模式的实例详解 工厂方法中的"工厂"和我们平常理解的一样:用于生产产品. 而客户是要和产品打交道,所以工厂方法模式的意义在于把客户和产品分开,达到解耦和更灵活的目的. ...

  9. java 工厂模式详解_Java设计模式之工厂模式详解

    简单工厂其实并不是设计模式,只是一种编程习惯. 首先我们创建父类Cup,所有杯子类的父类.再创建它的子类BigCup和SmallCup类. public abstract class Cup { pu ...

最新文章

  1. linux oracle dblink 访问 postgresql_从Oracle到PG-PostgreSQL数据库参数配置和查看
  2. 电脑有独显内存还被占用_独显和集成显卡怎么分别
  3. html中绝对定位的父级,父元素相对定位,子元素绝对定位
  4. XP系统的用户头像是在那个文件夹里面
  5. office 2013 安装问题
  6. 掌握大数据数据分析师吗?_要掌握您的数据吗? 这就是为什么您应该关心元数据的原因...
  7. sharepoint服务器安装已安装netframework4.5,仍提示未安装
  8. 零窗口探测怎么抓包_万事俱备,只待“窗口”!航天任务中的重要环节:“发射窗口”!...
  9. 如果更改列为自增自段
  10. abb伺服电机如何进行挑选_PLC是怎么控制伺服电机的?如何设计一个伺服系统?...
  11. CAA创建自定义CATIA工具栏按钮和菜单
  12. BZOJ 1725: [Usaco2006 Nov]Corn Fields牧场的安排
  13. java.util.stream.DoubleStream
  14. MagicDraw 18.5 SP4
  15. 什么样的团队才是理想中的团队? (转自AtTeam官微的博客)
  16. 力促产学研结合 中国医学人工智能大会圆满落幕
  17. 使用计算机视觉和深度学习创建现代 OCR 管道
  18. pandas 学习汇总10 - 统计:窗口函数rolling,expanding( tcy)
  19. Android工程师进阶34讲学习笔记
  20. 有哪些适合放在程序员办公桌上的高逼格物件?

热门文章

  1. mysql使用函数批量插入数据
  2. Protobuf —— .proto文件详解
  3. KMP算法详解(超级详细)
  4. 剑桥少儿英语预备级教案(上) Unit 5 Let’s play
  5. 修改ubuntu hostname
  6. Gitolite使用
  7. fedora 显示器 输入信号超出范围
  8. [企业管理]员工生育保障问题的讨论
  9. 关于数据结构和图论的一些入门攻略
  10. 使用CadLib实现CAD(dxf、dwg格式)文件的读取和显示