java中工厂方法模式_工厂方法模式-Java设计模式笔记(二) | 六阿哥博客

工厂方法模式是定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。属于创建型,也属于GOF23种设计模式。

适用范围

1.创建对象需要大量重复的代码。

2.客户端(应用层)不依赖于产品类实例如何被创建、实现等细节。

3.一个类通过其子类来指定创建哪个对象。

优缺点

优点:用户只需要关心所需产品对应的工厂,无需关心创建细节。加入新产品符合开闭原则,提高可扩展性。

缺点:类的个人容易过多,增加复杂度。增加了系统的抽象性和理解难度。

示例

Video.java 视频抽象类,提供生产视频的抽象方法。

package com.zaiae.design.pattern.creational.factorymethod;

public abstract class Video {

public abstract void produce();

}

1

2

3

4

5

packagecom.zaiae.design.pattern.creational.factorymethod;

publicabstractclassVideo{

publicabstractvoidproduce();

}

JavaVideo.java Java视频类,继承视频抽象类,并实现自己的生产视频逻辑。

package com.zaiae.design.pattern.creational.factorymethod;

public class JavaVideo extends Video {

@Override

public void produce() {

System.out.println("录制一套Java课程视频");

}

}

1

2

3

4

5

6

7

8

9

packagecom.zaiae.design.pattern.creational.factorymethod;

publicclassJavaVideoextendsVideo{

@Override

publicvoidproduce(){

System.out.println("录制一套Java课程视频");

}

}

PythonVideo.java Python视频类,继承视频抽象类,并实现自己的生产视频逻辑。

package com.zaiae.design.pattern.creational.factorymethod;

public class PythonVideo extends Video {

@Override

public void produce() {

System.out.println("录制一套Python课程视频");

}

}

1

2

3

4

5

6

7

8

9

packagecom.zaiae.design.pattern.creational.factorymethod;

publicclassPythonVideoextendsVideo{

@Override

publicvoidproduce(){

System.out.println("录制一套Python课程视频");

}

}

VideoFactory.java 生产视频的工厂方法基类,只定义规范和契约。我们该使用抽象类还是接口,需要根据实际需求来确定。

package com.zaiae.design.pattern.creational.factorymethod;

public abstract class VideoFactory {

public abstract Video getVideo();

}

1

2

3

4

5

packagecom.zaiae.design.pattern.creational.factorymethod;

publicabstractclassVideoFactory{

publicabstractVideogetVideo();

}

JavaVideoFactory.java 生产Java视频的工厂方法类,创建需要的对象。

package com.zaiae.design.pattern.creational.factorymethod;

public class JavaVideoFactory extends VideoFactory {

@Override

public Video getVideo() {

return new JavaVideo();

}

}

1

2

3

4

5

6

7

8

packagecom.zaiae.design.pattern.creational.factorymethod;

publicclassJavaVideoFactoryextendsVideoFactory{

@Override

publicVideogetVideo(){

returnnewJavaVideo();

}

}

PythonVideoFactory.java 生产Python视频的工厂方法类,创建需要的对象。

package com.zaiae.design.pattern.creational.factorymethod;

public class PythonVideoFactory extends VideoFactory {

@Override

public Video getVideo() {

return new PythonVideo();

}

}

1

2

3

4

5

6

7

8

packagecom.zaiae.design.pattern.creational.factorymethod;

publicclassPythonVideoFactoryextendsVideoFactory{

@Override

publicVideogetVideo(){

returnnewPythonVideo();

}

}

Test.java 客户端(应用层)调用工厂方法,创建需要的对象。

package com.zaiae.design.pattern.creational.factorymethod;

public class Test {

public static void main(String[] args) {

VideoFactory videoFactory = new JavaVideoFactory();

videoFactory.getVideo().produce();

VideoFactory videoFactory1 = new PythonVideoFactory();

videoFactory1.getVideo().produce();

}

}

1

2

3

4

5

6

7

8

9

10

11

12

packagecom.zaiae.design.pattern.creational.factorymethod;

publicclassTest{

publicstaticvoidmain(String[]args){

VideoFactoryvideoFactory=newJavaVideoFactory();

videoFactory.getVideo().produce();

VideoFactoryvideoFactory1=newPythonVideoFactory();

videoFactory1.getVideo().produce();

}

}

UML结构图:

f95f31470d3c17afee010215fba5c8b3.gif

JDK中的使用例子

例如在 java.util.Collection 接口中的 Iterator iterator() 方法,就是一个工厂方法。

在具体的实现工厂 java.util.ArrayList 中重写 Iterator iterator() 方法,用于创建 Iterator 实例对象。

public Iterator iterator() {

return new Itr();

}

private class Itr implements Iterator {

int cursor; // index of next element to return

int lastRet = -1; // index of last element returned; -1 if no such

int expectedModCount = modCount;

Itr() {}

public boolean hasNext() {

return cursor != size;

}

@SuppressWarnings("unchecked")

public E next() {

checkForComodification();

int i = cursor;

if (i >= size)

throw new NoSuchElementException();

Object[] elementData = ArrayList.this.elementData;

if (i >= elementData.length)

throw new ConcurrentModificationException();

cursor = i + 1;

return (E) elementData[lastRet = i];

}

public void remove() {

if (lastRet < 0)

throw new IllegalStateException();

checkForComodification();

try {

ArrayList.this.remove(lastRet);

cursor = lastRet;

lastRet = -1;

expectedModCount = modCount;

} catch (IndexOutOfBoundsException ex) {

throw new ConcurrentModificationException();

}

}

@Override

@SuppressWarnings("unchecked")

public void forEachRemaining(Consumer super E> consumer) {

Objects.requireNonNull(consumer);

final int size = ArrayList.this.size;

int i = cursor;

if (i >= size) {

return;

}

final Object[] elementData = ArrayList.this.elementData;

if (i >= elementData.length) {

throw new ConcurrentModificationException();

}

while (i != size && modCount == expectedModCount) {

consumer.accept((E) elementData[i++]);

}

// update once at end of iteration to reduce heap write traffic

cursor = i;

lastRet = i - 1;

checkForComodification();

}

final void checkForComodification() {

if (modCount != expectedModCount)

throw new ConcurrentModificationException();

}

}

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

61

62

63

64

65

66

67

68

69

70

publicIteratoriterator(){

returnnewItr();

}

privateclassItrimplementsIterator{

intcursor;//indexofnextelementtoreturn

intlastRet=-1;//indexoflastelementreturned;-1ifnosuch

intexpectedModCount=modCount;

Itr(){}

publicbooleanhasNext(){

returncursor!=size;

}

@SuppressWarnings("unchecked")

publicEnext(){

checkForComodification();

inti=cursor;

if(i>=size)

thrownewNoSuchElementException();

Object[]elementData=ArrayList.this.elementData;

if(i>=elementData.length)

thrownewConcurrentModificationException();

cursor=i+1;

return(E)elementData[lastRet=i];

}

publicvoidremove(){

if(lastRet<0)

thrownewIllegalStateException();

checkForComodification();

try{

ArrayList.this.remove(lastRet);

cursor=lastRet;

lastRet=-1;

expectedModCount=modCount;

}catch(IndexOutOfBoundsExceptionex){

thrownewConcurrentModificationException();

}

}

@Override

@SuppressWarnings("unchecked")

publicvoidforEachRemaining(Consumerconsumer){

Objects.requireNonNull(consumer);

finalintsize=ArrayList.this.size;

inti=cursor;

if(i>=size){

return;

}

finalObject[]elementData=ArrayList.this.elementData;

if(i>=elementData.length){

thrownewConcurrentModificationException();

}

while(i!=size&&modCount==expectedModCount){

consumer.accept((E)elementData[i++]);

}

//updateonceatendofiterationtoreduceheapwritetraffic

cursor=i;

lastRet=i-1;

checkForComodification();

}

finalvoidcheckForComodification(){

if(modCount!=expectedModCount)

thrownewConcurrentModificationException();

}

}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部