Java研究之学习设计模式-抽象工厂模式详解



简介:

         当每个抽象产品都有多于一个的具体子类的时候,工厂角色怎么知道实例化哪一个子类呢?比如每个抽象产[1] 品角色都有两个具体产品。抽象工厂模式提供两个具体工厂角色,分别对应于这两个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化。每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。

每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结构。(摘自百度百科)

话语说得太抽象,程序员最好的表示方式是code,当然,我们先用uml类图来直观认识。

UML类图:

从上面的类图中,能够看到,有两个产品族,分别是抽象产品1和抽象产品2这两个产品族,每个具体工厂可以生产多个产品族的产品,比如具体产品1既生产具体产品11,也生产具体产品21。

产品族:是指位于不同产品等级结构中,功能相关联的产品组成的家族。比如在上图中,具体产品11和具体产品12组成一个产品族。

代码剖析:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

//产品族1

interface AbstractProduct1{}

class Product11
implements AbstractProduct1{

public Product11(){

System.out.println("生产了产品11");

}

}

class
Product12 implements
AbstractProduct1{

public
Product12(){

System.out.println("生产了产品12");

}

}

//产品族2

interface
AbstractProduct2{}

class
Product21 implements
AbstractProduct2{

public
Product21(){

System.out.println("生产了产品21");

}

}

class Product22
implements AbstractProduct2{

public Product22(){

System.out.println("生产了产品22");

}

}

interface AbstractFactory{

AbstractProduct1 createP1();//生产产品族1的产品

AbstractProduct2
createP2();//生产产品族2的产品

}

//具体工厂1,由具体工厂1自己决定生产每个产品族的哪一个产品

class
Factory1 implements
AbstractFactory{

public
AbstractProduct1 createP1(){

return new
Product11();

}

public AbstractProduct2
createP2(){

return
new Product21();

}

}

//具体工厂2,由具体工厂2自己决定生产每个产品族的哪一个产品

class Factory2
implements AbstractFactory{

public AbstractProduct1
createP1(){

return
new Product12();

}

public
AbstractProduct2 createP2(){

return new
Product22();

}

}

抽象工厂和具体工厂的区别

工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类只能创建一个具体产品类的实例。

抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类可以创建多个具体产品类的实例。

区别工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

什么情况下使用抽象工厂模式:

1一个系统不应当依赖于产品类实例如何被创建,组合和表达的细节,这对于所有形态的工厂模式都是重要的。

2这个系统的产品多于一个产品族,而系统只消费了其中某一族的产品。(这一条叫做抽象工厂模式的原使用意)

3同属于一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。

4系统提供一个产品类的库,所有产品一同样的接口实现,从而是客户端不依赖于具体实现。

更加符合开闭原则

开闭原则要求一个软件系统可以在不修改原有代码的情况下,通过扩展达到增强其功能的目的。

而抽象工厂模式对于增加一个新的产品族更加支持。

实例引导:

假设富士康公司给两个品牌作代工产品:苹果和三星。这两个品牌都有手机和平板产品,由于生产工艺的不同,富士康开设了两条生产线,一条线只生产手机,另一条线只生产平板电脑。苹果公司有新产品发布,向富士康订购生产iPad, 富士康负责人到生产平板的工厂,要求生产苹果的pad,很快iPad生产出来了。苹果公司又有新款iphone要生产了,向富士康订购,富士康负责人又转身到生产手机的工厂,要求生产iphone,很快iPhone造好了。

样例类图:

样例代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

//苹果产品族

interface Apple{}

class
Iphone implements
Apple{//苹果手机

public
Iphone(){

System.out.println("生产了iphone");

}

}

class Ipad
implements Apple{//苹果pad

public
Ipad(){

System.out.println("生产了ipad");

}

}

//三星产品族

interface
SamSung{}

class SanSungPhone
implements SamSung{//三星手机

public
SanSungPhone(){

System.out.println("生产了三星手机");

}

}

class
SamSungPad implements
SamSung{//三星平板

public
SamSungPad(){

System.out.println("生产了三星平板电脑");

}

}

//富士康工厂抽象接口

interface
FuShiKang{

Apple createApple();//生产苹果产品族的产品

SamSung
createSamSung();//生产三星产品族的产品

}

//富士康专门生产手机的工厂

class PhoneFactory
implements FuShiKang{

public
Apple createApple(){//生产苹果手机

return
new Iphone();

}

public
SamSung createSamSung(){//生产三星手机

return
new SanSungPhone();

}

}

//富士康专门生产平板电脑的工厂

class
PadFactory implements
FuShiKang{

public
Apple createApple(){//生产苹果的ipad

return
new Ipad();

}

public
SamSung createSamSung(){//生产三星的平板

return
new SamSungPad();

}

}

public class
Main{

public
static void
main(String[]
args){

//订购商来到富士康,要订购一台iphone,所以负责人告诉生产手机的工厂加工生产

FuShiKang
factory=new
PhoneFactory();

Apple iphone=
factory.createApple();

//然后要一些三星平板电脑,所以负责人告诉生产平板电脑的工厂加工生产

factory=new
PadFactory();

SamSung samsungPad=
factory.createSamSung();

}

}

结果:

Java研究之学习设计模式-抽象工厂模式详解

时间: 2024-10-05 15:19:23

Java研究之学习设计模式-抽象工厂模式详解的相关文章

Java研究之学习设计模式-简单工厂模式详解

 简介: 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 类图: 从UML类图中,可以看出,简单工厂模式的意思,就是把一个类内部,需要生成的部分,提取出来,变为一个工厂,通过工厂来new对象. 假设我们要吃苹果了,我们可以在代码中new一个苹果出来:当我们需要吃香蕉了,我们在代码中new一个香蕉出来.这种做法你会不会觉得麻烦

Java研究之学习设计模式-多例模式详解

 介绍: 所谓的多例模式,实际上就是单例模式(回顾看这里)的自然推广,作为对象的创建模式,多例模式有以下特点: 1可以有多个实例 2多例类必须自己创建,管理自己的实例,并向外界提供自己的实例. 从上面的特点中,可以体会多例模式与单例模式的不同.单例模式只允许一个实例的存在. 单例类图: 多例类图: 类图更直观的表示了多例类,该多例类会提供多个实例,实例的数量我们是可以自己控制的,如果数量不多的话,实例就可以当做是类的内部实例变量:如果实例很多,那么可以用数组,或者可变长度的数组来进行存储.下

2018.4.4 设计模式之简单工厂模式与抽象工厂模式详解(一)

1设计模式 简介 设计模式时一套被反复使用的多数人知晓的.经过分类编目的.代码设计经验的总结.设计模式使代码设计真正工程化,模式是软件工程的基石. 2.什么是GOF(四人帮 . Gang of Four) Design Patterns-Elementes of ReusableObject -Oriented Software (中文译名:设计模式-可复用的面向软件元素) 四位作者合成GOF,他们所提出的设计模式主要是基于鱼虾的面向对象设计原则 对接口编程儿不是对实现编程: 优先使用对象组合而

JAVA 设计模式之 工厂模式详解

一.简单工厂模式 简单工厂模式(Simple Factory Pattern)是指由一个工厂对象决定创建出哪一种产品类 的实例.属于创建型模式,但它不属于 GOF,23 种设计模式 (参考资料: http://en.wikipedia.org/wiki/Design_Patterns#Patterns_by_Type). 简单工厂模式适用于的场景: 1.适用 于工厂类负责创建的对象较少的场景,    2.且客户端只需要传入工厂类的参数,对于如何创 建对象的逻辑不需要关心. 简单工厂模式缺点: 1

2.java设计模式-抽象工厂模式

抽象工厂模式简介: 每一个模式都是针对某一种问题的解决方案.抽象工厂模式与工厂模式最大的区别在于,工厂模式针对的是一个产品等级结构,而抽象工厂模式面对的是多个产品等级结构,即产品族的概念. 这里讲解一下产品等级与产品族:Cpu属于一种产品,Cpu有多种型号,比如Intel的.AMD的,它们都属于同一个产品等级,即同一类产品下边的不同系列或者品牌:而产品族是指位于不同产品等级结构中,功能相关联的产品组成的家族.比如对于Intel公司,这家公司生产的Cpu,也生产主板,内存,芯片组等相关联产品组成一

设计模式学习03—抽象工厂模式

1.动机与定义 工厂模式中,一个工厂仅仅能提供一个或一类产品,当产品种类较多,形成产品系列(比方我们要创建跨平台的button,菜单,文本框等等一系列GUI控件: 单纯使用工厂模式会产生大量工厂,并且后期维护也不方便,我们能够从产品中找到规律,假设产品等级相对固定,以后仅仅会新增产品族,那么我们就能够把整个产品族放到一个工厂创建,以后新增其它系统产品族也很方便,例如以下图: 这样的模式就是抽象工厂,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则须要面对多个产品等级结构,一个工厂等级结构能

设计模式——抽象工厂模式学习

要想正确的理解设计模式,首先必须明确它是为了解决什么问题而提出来的. 抽象工厂设计模式概念: 针对抽象工厂这个设计模式,我查找了不少资料,感觉只有涉及产品级别和产品族的才是理解了抽象工厂设计模式的精髓,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式针对的是多个产品等级结构.有些观点认为抽象工厂模式是为了解决客户端代码与工厂类的耦合问题,我认为这种观点的解决方案只是简单工厂模式的一个应用,而这种观点认为的抽象工厂模式是: 工厂模式+简单工厂模式=抽象工厂模式,这是不正确. 针对的问题: 针对

设计模式-抽象工厂模式(C#)

设计模式--抽象工厂模式(JAVA) 在抽象工厂模式中,一个具体工厂可以生产一组相关的具体产品,这样的一组产品成为产品族,产品族中的每一个产品都属于某一个产品继承等等级结构.当系统所提供的工厂生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构.属于不同类型的具体产品时就可以使用抽象工厂模式. 抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建,当一个工

设计模式 - 抽象工厂模式(abstract factory pattern) 详解

抽象工厂模式(abstract factory pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27091671 参考工厂模式: http://blog.csdn.net/caroline_wendy/article/details/27081511 抽象工厂模式: 提供一个接口, 用于创建相关或依赖对象的家族, 而不需要明确指定具体类. 全部代码: http://download.csdn.net/de