跟屌丝大哥学习设计模式

  • 时间:
  • 浏览:0
  • 来源:uu快3开奖_uu快3娱乐_输钱

15

7

1

}

22

      黄色人种的创建工厂如代码清单8-17所示。

图8-6 延迟初始化通用类图

18

      工厂法律法律依据模式的通用类图如图8-2所示。

13

6

product = new ConcreteProduct1();

14

29

5

20

//声明阴阳八卦炉

35

Product product = creator.createProduct(ConcreteProduct1.class);

14

7

代码清单8-6 人类创建工厂

public static synchronized Product createProduct(String type) throws Exception{

7

21

24

}

return product;

6

4

5

15

Human human=null;

return new YellowHuman();

7

22

16

--发名的第二批人是黑色人种--

      抽象工厂类负责定义产品对象的产生,源代码如代码清单8-10所示。

      人种有了,八卦炉需用了,剩下的工作本来 我女娲分发黄土,或者命令八卦炉现在开使生产,其过程如代码清单8-7所示。

try {

17

20

7

18

21

32

2

4

33

16

8

1

31

      亲们在类图中加进去了AbstractHumanFactory抽象类,一齐把createHuman法律法律依据设置为静态类型,冗杂了类的创建过程,变更的源码仅仅是HumanFactory和NvWa类,HumanFactory如代码清单8-13所示。

5

blackHuman.talk();

public class HumanFactory extends AbstractHumanFactory {

23

6

      代码还比较简单,通过定义一个多多Map容器,容纳所有产生的对象,将会在Map容器中将会有的对象,则直接取出返回,将会这么 ,则根据需用的类型产生一个多多对象并里装到Map容器中,以方便下次调用。

28

代码清单8-19 场景类NvWa

//产品类的公共法律法律依据

34

/*

}

9

8

      每当时人种(具体的产品类)都对应了一个多多创建者,每个创建者都独立负责创建对应的产品对象,非常符合单一职责原则,按照这一 模式亲们来看代码变化。

public void doSomething(){

}

public static void main(String[] args) {

18

10

5

8

blackHuman.getColor();

代码清单8-11 具体工厂类

}

public abstract class Product {

5

      考虑到需用形状清晰,亲们就为每个产品定义一个多多创造者,或者由调用者当时人去选者 与哪个工厂法律法律依据关联。亲们还是以女娲造人为例,每当时人种需用一个多多固定的八卦炉,分别发名黑色人种、白色人种、黄色人种,修改后的类图如图8-4所示。

whiteHuman.talk();

      其中的“?”表示的是,或者我实现了Human接口的类都里能作为参数,泛型是JDK 1.5中的一个多多非常重要的新形状,它减少了对象间的转换,约束其输入参数类型,对Collection集合下的实现类都里能定义泛型。有关泛型全版知识,请参考相关的Java语法文档。

6

constructor.setAccessible(true);

//获得无参构造

}

5

5

3

13

21

11

2

//异常防止

31

}

19

11

      亲们原本考虑一个多多大问題:一个多多模块仅需用一个多多工厂类,这么 必要把它产生出来,使用静态的法律法律依据就里能了,根据这一 要求,亲们把上例中的AbstarctHumanFactory修改一下,类图如图8-3所示。

80

public class Singleton {

10

System.out.println("\n--发名的第三批人是黄色人种--");

17

白色人种会说话,一般需用或者单字节。

21

1

12

3

}

8

}

yellowHuman.getColor();

}

4

System.out.println("\n--发名的第二批人是黑色人种--");

      首先,工厂法律法律依据模式是new一个多多对象的替代品,什么都有 在所有需用生成对象的地方都里能使用,或者需用慎重地考虑是是否要增加一个多多工厂类进行管理,增加代码的冗杂度。

return product;

26

12

33

9

3

private static final Map<String,Product> prMap = new HashMap();

29

19

whiteHuman.talk();

4

if(prMap.containsKey(type)){

      其次,需用灵活的、可扩展的框架时,里能考虑采用工厂法律法律依据模式。万物皆对象,那万物也就皆产品类,这类需用设计一个多多连接邮件服务器的框架,有这一 网络协议可供选者 :POP3、IMAP、HTTP,亲们就里能把这这一 连接法律法律依据作为产品类,定义一个多多接口如IConnectMail,或者定义对邮件的操作法律法律依据,一个多多具体的产品类(也本来 我连接法律法律依据)进行不同的实现,再定义一个多多工厂法律法律依据,按照不同的传入条件,选者 不同的连接法律法律依据。这么 设计,里能做到完美的扩展,如这一 邮件服务器提供了WebService接口,很好,亲们或者我增加一个多多产品类就里能了。

代码清单8-13 简单工厂模式中的工厂类

6

prMap.put(type,product);

}

//产生一个多多实例对象

1

25

}

15

10

Human blackHuman = HumanFactory.createHuman(BlackHuman.class);

4

11

7

}

      Singleton保证这么 通过正常的渠道建立一个多多对象,那SingletonFactory怎么建立一个多多单例对象呢?答案是通过反射法律法律依据创建,如代码清单8-21所示。

4

12

17

白色人种的皮肤颜色是白色的!

37

blackHuman.getColor();

代码清单8-17 黄色人种的创建类

2

36

25

      第7章讲述了单例模式以及扩展出的多例模式,或者指出了单例和多例的这一 缺点,亲们是需用里能采用工厂法律法律依据模式实现单例模式的功能呢?单例模式的核心要求本来 我在内存中只一个多多多对象,通过工厂法律法律依据模式也里能只在内存中生产一个多多对象。类图如图8-5所示。

//不允许通过new产生一个多多对象

28

public class ProductFactory {

10

17

}

8

15

}

15

36

18

31

32

return singleton;

21

return new BlackHuman();

8

38

80

3

23

25

public class NvWa {

//一齐把对象里装缓存容器中

System.out.println("人种生成错误!");

14

}

8

6

37

8

3

1

3

      一个多多具体的创建工厂都非常简单,或者,将会一个多多系统比较冗杂时工厂类也会相应变冗杂。场景类NvWa修改后的代码如代码清单8-19所示。

37

//异常防止

6

图8-3 简单工厂模式类图

public Human createHuman() {

}

2

19

try {

代码清单8-15 多工厂模式的抽象工厂类

24

1

22

Human human=null;

Human whiteHuman = HumanFactory.createHuman(WhiteHuman.class);

37

//女娲第二次造人,火候过足,又是次品,

31

Constructor constructor=cl.getDeclaredConstructor();

9

}

1

--发名的第三批人是黄色人种--

13

1

2

19

15

8

blackHuman.talk();

public abstract class Creator {

private static Singleton singleton;

16

21

}

//第三次造人,火候正正好,优品!黄色人种

System.out.println("--发名的第一批人是白色人种--");

System.out.println("白色人种会说话,一般需用或者单字节。");

7

9

private Singleton(){

      工厂法律法律依据模式使用的频率非常高,在亲们日常的开发中总能见到它的身影。其定义为:

11

      以上通过工厂法律法律依据模式创建了一个多多单例对象,该框架里能继续扩展,在一个多多项目中里能产生一个多多单例构造器,所有需用产生单例的类都遵循一定的规则(构造法律法律依据是private),或者通过扩展该框架,或者我输入一个多多类型就里能获得唯一的一个多多实例。

whiteHuman.getColor();

11

public abstract class AbstractHumanFactory {

16

5

whiteHuman.talk();

//女娲第一次造人,火候过高 ,过高 产品

3

blackHuman.talk();

yellowHuman.talk();

4

14

22

static{

14

24

5

}

4

19

}

1

26

} catch (Exception e) {

      何为延迟初始化(Lazy initialization)?一个多多对象被消费完毕后,不须立刻释放,工厂类保持其初始清况 ,听候再次被使用。延迟初始化是工厂法律法律依据模式的一个多多扩展应用,其通用类图如图8-6所示。

}

      当亲们在做一个多多比较冗杂的项目时,总爱会遇到初始化一个多多对象很耗费精力的清况 ,所有的产品类都里装一个多多工厂法律法律依据中进行初始化会使代码形状不清晰。这类,一个多多产品类有五个具体实现,每个实现类的初始化(不仅仅是new,初始化包括new一个多多对象,并对对象设置一定的初始值)法律法律依据需用相同,将会写在一个多多工厂法律法律依据中,势必会原困该法律法律依据巨大无比,那为什么我么我在么在办?

public void getColor(){

5

      当然,在冗杂的应用中一般采用多工厂的法律法律依据,或者再增加一个多多协调类,防止调用者与各个子工厂交流,协调类的作用是封装子工厂类,对高层模块提供统一的访问接口。

黑人会说话,一般人听不懂。

3

27

//业务防止

9

4

} catch (Exception e) {

33

27

20

//将会Map中将会有这一 对象

10

5

7

36

7

4

} catch (Exception e) {

product = new ConcreteProduct2();

17

27

1

7

3

1

}

14

--发名的第一批人是白色人种--

代码清单8-22 延迟加载的工厂类

2

Class cl= Class.forName(Singleton.class.getName());

public class YellowHumanFactory extends AbstractHumanFactory {

public static Singleton getSingleton(){

24

23

10

16

11

35

public class NvWa {

System.out.println("白色人种的皮肤颜色是白色的!");

System.out.println("\n--发名的第二批人是黑色人种--");

5

21

public abstract Human createHuman(Class<? extends Human> c);

13

代码清单8-10 抽象工厂类

System.out.println("--发名的第一批人是白色人种--");

代码清单8-21 负责生成单例的工厂类

4

12

16

}

19

/*

12

9

24

whiteHuman.getColor();

1

11

}else{

public abstract void method2();

product = prMap.get(type);

* 创建一个多多产品对象,其输入参数类型里能自行设置

22

9

13

4

12

21

6

80

28

2

      Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses。定义一个多多用于创建对象的接口,让子类决定实例化哪一个多多类。工厂法律法律依据使一个多多类的实例化延迟到其子类。

7

7

public static Human createHuman(Class<? extends Human> c){

黄色人种的皮肤颜色是黄色的!

代码清单8-9 具体产品类

yellowHuman.getColor();

}

human = (Human)Class.forName(c.getName()).newInstance();

//女娲第一次造人,火候过高 ,过高 产品

3

10

10

2

//设置无参构造是可访问的

26

15

4

2

15

图8-2 工厂法律法律依据模式通用类图

6

22

11

System.out.println("人种生成错误!");

public Human createHuman() {

//定义一个多多生产的人种

14

16

}

public class ConcreteProduct1 extends Product {

//抽象法律法律依据

23

      在工厂法律法律依据模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象定义;Creator为抽象创建类,也本来 我抽象工厂,具体怎么创建产品类是由具体的实现工厂ConcreteCreator完成的。工厂法律法律依据模式的变种较多,亲们来看一个多多比较实用的通用源码。

public class HumanFactory {

Human whiteHuman = (new WhiteHumanFactory()).createHuman();

}

* 通常为String、Enum、Class等,当然也里能为空

4

public class ConcreteProduct2 extends Product {

public static void main(String[] args) {

public abstract Human createHuman();

public class WhiteHuman implements Human {

public void method1(){

13

}

3

whiteHuman.getColor();

Product product=null;

      具体的产品类里能有多个,都继承于抽象产品类,其源代码如代码清单8-9所示。

Human whiteHuman = YinYangLu.createHuman(WhiteHuman.class);

31

}

*/

12

7

23

      最后,工厂法律法律依据模式是典型的解耦框架。高层模块值需用知道产品的抽象类,这一 的实现类需用用关心,符合迪米特原则,我不需用的就不须去交流;也符合依赖倒转原则,只依赖产品类的抽象;当然也符合里氏替换原则,使用产品子类替换产品父类,没大问題!

}

4

singleton = (Singleton)constructor.newInstance();

      非常简单的类图,Singleton定义了一个多多private的无参构造函数,目的是不允许通过new的法律法律依据创建一个多多对象,如代码清单8-20所示。

6

//定义一个多多生产出的人种

14

1

}

15

4

Human blackHuman = (new BlackHumanFactory()).createHuman();

3

18

Creator creator = new ConcreteCreator();

//业务逻辑防止

5

      延迟加载还里能使用在一个多多对象初始化比较冗杂的清况 ,这类硬件访问,涉及多方面的交互,则里能通过延迟加载降低对象的产生和销毁带来的冗杂性。

23

*/

3

27

40

12

5

13

1

2

12

17

11

3

yellowHuman.talk();

35

35

4

      延迟加载框架是里能扩展的,这类限制某一个多多产品类的最大实例化数量,里能通过判断Map中已有的对象数量来实现,原本的防止是非常有意义的,这类JDBC连接数据库,一定会要求设置一个多多MaxConnections最大连接数量,该数量本来 我内存中最大实例化的数量。

23

      抽象产品类代码如代码清单8-8所示。

//女娲第二次造人,火候过足,又是次品,

public Human createHuman(Class<? extends Human> c){

Human blackHuman = YinYangLu.createHuman(BlackHuman.class);

6

15

public Product createProduct(Class<? extends Product> c) {

8

      运行结果这么 处在变化,或者亲们的类图变简单了,或者调用者也比较简单,该模式是工厂法律法律依据模式的弱化,将会简单,什么都有 被称为简单工厂模式(Simple Factory Pattern),也叫做静态工厂模式。在实际项目中,采用该法律法律依据的案例还是比较多的,其缺点是工厂类的扩展比较困难,不符合开闭原则,但它仍然是一个多多非常实用的设计模式。

13

26

System.out.println("--发名的第一批人是白色人种--");

12

product = (Product)Class.forName(c.getName()).newInstance();

20

黑色人种的创建工厂如代码清单8-16所示。

}

代码清单8-7 女娲类

8

8

public Human createHuman() {

}

35

34

      具体怎么产生一个多多产品的对象,是由具体的工厂类实现的,如代码清单8-11所示。

}

      HumanFactory类仅一个多多多地方变化:加进去继承抽象类,并在createHuman前增加static关键字。工厂类处在变化,也一齐引起了调用者NvWa的变化,如代码清单8-14示。

4

28

7

public static void main(String[] args) {

public abstract class AbstractHumanFactory {

yellowHuman.getColor();

9

//产生另有一当时人种

2

5

10

      工厂法律法律依据模式在项目中使用得非常频繁,以至于什么都有 代码中都中有 工厂法律法律依据模式。该模式几乎尽人皆知,但需用每当时人都能用得好。熟能生巧,熟练掌握该模式,多思考工厂法律法律依据怎么应用,或者工厂法律法律依据模式还里能与这一 模式混合使用(这类模版法律法律依据模式、单例模式、原型模式等),变化出无穷的优秀设计,这也正是软件设计和开发的乐趣所在。

      再次,工厂法律法律依据模式里能用在异构项目中,这类通过WebService与一个多多非Java的项目交互,好的反义词WebService号称是里能做到异构系统的同构化,或者在实际的开发中,还是会碰到什么都有 大问題,如类型大问題、WSDL文件的支持大问題,等等,从WSDL中产生的对象都认为是一个多多产品,或者由一个多多具体的工厂类进行管理,减少与外围系统的耦合。

20

18

return human;

10

9

9

9

29

public void method2() {

11

41

33

3

13

5

1

2

14

14

25

17

}

//业务逻辑防止

}else{

}

//女娲第二次造人,火候过足,又是次品,

11

8

//第三次造人,火候正正好,优品!黄色人种

9

}

16

24

9

16

3

34

4

public class YellowHumanFactory extends AbstractHumanFactory {

2

28

20

blackHuman.getColor();

    所有的人种定义完毕,下一步本来 我定义一个多多八卦炉,或者烧制人类。亲们想象一下,女娲最将会给八卦炉下达哪几种样的生产命令呢?应该是“给我生产出一个多多黄色人种(YellowHuman类)”,而无需是“给我生产一个多多会走、会跑、会说话、皮肤是黄色的人种”,将会原本的命令增加了交流的成本,作为一个多多生产的管理者,或者我知道生产哪几种就里能了,而不需用事物的具体信息。通过分析,亲们发现八卦炉生产人类的法律法律依据输入参数类型应该是Human接口的实现类,这也解释了为哪几种类图上的AbstractHumanFactory抽象类中createHuman法律法律依据的参数为Class类型。其源代码如代码清单8-5所示。

13

黄色人种会说话,一般说的需用双字节。

3

24

      运行结果还是相同。亲们回顾一下,每一个多多产品类都对应了一个多多创建类,好处本来 我创建类的职责清晰,或者形状简单,或者给扩展性和维护性带来了一定的影响。为哪几种这么 说呢?将会要扩展一个多多产品类,就需用建立一个多多相应的工厂类,原本就增加了扩展的难度。将会工厂类和产品类的数量相同,维护需用用考虑一个多多对象之间的关系。

}

public class NvWa {

2

public class ConcreteCreator extends Creator {

16

13

10

25

10

25

}

System.out.println("\n--发名的第三批人是黄色人种--");

13

human = (Human)Class.forName(c.getName()).newInstance();

AbstractHumanFactory YinYangLu = new HumanFactory();

      ProductFactory负责产品类对象的创建工作,或者通过prMap变量产生一个多多缓存,对需用再次被重用的对象保留,Product和ConcreteProduct是一个多多示例代码,请参考代码清单8-8和8-9。ProductFactory如代码清单8-22所示。

32

13

1

return human;

11

26

10

System.out.println("\n--发名的第二批人是黑色人种--");

25

      注意,亲们在这里采用了JDK 1.5的新形状:泛型(Generic),通过定义泛型对createHuman的输入参数产生两层限制:

代码清单8-8 抽象产品类

}

32

19

7

6

public void method2() {

19

7

8

6

20

15

      首先,良好的封装性,代码形状清晰。一个多多对象创建是有条件约束的,如一个多多调用者需用一个多多具体的产品对象,或者我知道这一 产品的类名(或约束字符串)就里能了,无需知道创建对象的艰辛过程,减少模块间的耦合。

}

      该通用代码是一个多多比较实用、易扩展的框架,读者里能根据实际项目需用进行扩展。

黑色人种的皮肤颜色是黑色的!

12

39

9

17

2

} catch (Exception e) {

}

29

抽象工厂类如代码清单8-15所示。

2

20

18

      最后,里能使用在测试驱动开发的框架下,这类,测试一个多多类A,就需用把与类A有关联关系的类B也一齐产生出来,亲们里能使用工厂法律法律依据模式把类B虚拟出来,防止类A与类B的耦合。目前将会JMock和EasyMock的诞生,该使用场景将会弱化了,读者里能在遇到此种清况 时直接考虑使用JMock或EasyMock。

17

try {

14

public class SingletonFactory {

2

      注意 抽象法律法律依据中将会不再需用传递相关参数了,将会每一个多多具体的工厂都将会非常明确当时人的职责:创建当时人负责的产品类对象。

1

      其次,工厂法律法律依据模式的扩展性非常优秀。在增加产品类的清况 下,或者我适当地修改具体的工厂类或扩展一个多多工厂类,就里能完成“拥抱变化”。这类在亲们的例子中,需用增加一个多多棕色人种,则只需用增加一个多多BrownHuman类,工厂类无需任何修改就可完成系统扩展。

1

代码清单8-18 白色人种的创建类

8

3

7

//业务逻辑防止

13

3

10

public class Client {

9

public static void main(String[] args) {

34

//产生另有一当时人种

9

代码清单8-12 场景类

图8-4 多个工厂类的类图

return new WhiteHuman();

12

6

17

15

      场景类的调用法律法律依据如代码清单8-12所示。

14

11

public abstract Product createProduct(Class<? extends Product> c);

10

6

11

      哇,人类的生产过程就展现出来了!这一 世界就热闹起来了,黑人、白人、黄人都现在开使活动了,这也正是亲们现在的真实世界。以上本来 我工厂法律法律依据模式(没错,对该每段有大问題,请继续阅读下去)。

      工厂法律法律依据模式有什么都有 扩展,或者与这一 模式结合使用威力更大,下面将介绍这一 扩展。

22

12

代码清单8-16 黑色人种的创建类

5

33

15

80

36

1

代码清单8-20 单例类

5

      目前女娲只一个多多多八卦炉,好的反义词现了生产人类的法律法律依据,如代码清单8-6所示。

//女娲第一次造人,火候过高 ,过高 产品

Product product =null;

32

29

try {

80

      通过获得类构造器,或者设置访问权限,生成一个多多对象,或者提供内部管理访问,保证内存中的对象唯一。当然,这一 类也里能通过反射的法律法律依据建立一个多多单例对象,好的反义词这么 ,或者一个多多项目或团队是有章程和规范的,何况将会提供了一个多多获得单例对象的法律法律依据,为哪几种需用重新创建一个多多新对象呢?除非是大家作恶。

2

}

27

2

yellowHuman.talk();

6

      再次,屏蔽产品类。这一 特点非常重要,产品类的实现怎么变化,调用者需用需用关心,它只需用关心产品的接口,或者我接口保持不表,系统中的上层模块就不须处在变化,将会产品类的实例化工作是由工厂类负责,一个多多产品对象具体由哪一个多多产品生成是由工厂类决定的。在数据库开发中,亲们应该不利于深刻体会到工厂法律法律依据模式的好处:将会使用JDBC连接数据库,数据库从MySql切换到Oracle,需用改动地方本来 我切换一下驱动名称(前提条件是SQL得话是标准得话),这一 的需用需用修改,这是工厂法律法律依据模式灵活性的一个多多直接案例。

public void talk() {

19

5

图8-5 工厂法律法律依据模式替代单例模式类图

代码清单8-14 简单工厂模式中的场景类

if(type.equals("Product1")){

6

Human yellowHuman = YinYangLu.createHuman(YellowHuman.class);

34

37

9

14

8

public class BlackHumanFactory extends AbstractHumanFactory {

8

      白色人种的创建工厂如代码清单8-18所示。

}

代码清单8-5 抽象人类创建工厂

18

      人种有了,八卦炉有了,负责生产的女娲需用了,激动人心的时刻到来了,亲们运行一下,结果如下所示。

36

Human yellowHuman = (new YellowHumanFactory()).createHuman();

18

System.out.println("\n--发名的第三批人是黄色人种--");

* 继续业务防止

}

Human yellowHuman = HumanFactory.createHuman(YellowHuman.class);

//第三次造人,火候并且好,优品!黄色人种

12

}