Java模2,JAVA中的设计模式二(工厂模式)

工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类。

工厂模式主要有:

简单工厂模式,工厂方法,抽象工厂;

简单工厂:

又叫静态工厂,是工厂模式三中状态中结构最为简单的。主要有一个静态方法,用来接受参数,并根据参数来决定返回实现同一接口的不同类的实例。我们来看一个具体的例子:

如下面价单的图形

99b483270c97c5e19aa870d1ab014b1c.png

代码如下:

首先我们先创建一个抽象的产品:

1 packageFactory;2

3 public abstract classBMW {4

5 publicBMW() {6 }7

8 }

然后我们具体的产品类去继承我们的抽象产品:

1 public class BMW320 extendsBMW{2 publicBMW320() {3 //TODO Auto-generated constructor stub

4 System.out.println("生产BMW320");5 }6 }7

8

9

10

11

12 public class BMW523 extendsBMW{13 publicBMW523() {14 //TODO Auto-generated constructor stub

15 System.out.println("生产BMW523");16 }17 }

下面我们创建我们的工厂:

1 packageFactory;2

3 public classFactory {4 public BMW crateBMW(inttype){5 if(type==320){6 return newBMW320();7 }else if (type==523){8 return newBMW523();9 }else{10 return null;11 }12 }13 }

下面就是客户了,客户需要产品,我们进行生产:

1 packageFactory;2

3 public classCustomer {4 public static voidmain(String[] args) {5 Factory f=newFactory();6 BMW b320=f.crateBMW(320);7 BMW b523=f.crateBMW(523);8 }9 }

运行的结果如下-----:

24c3ba5e3a514007394a003879e9b1e5.png

这个就是简单的工厂模式;

上面的代码告诉我们,简单工厂并不简单,它是整个模式的核心,一旦他出了问题,整个模式都将受影响而不能工作,为了降低风险和为日后的维护、扩展做准备,我们需要对它进行重构,引入工厂方法。

工厂方法:

工厂方法其实就是,不同额工厂对应不同的产品,就算其中某一个工厂不能正常工作了,也不会影响到其他的工厂工作;

d5776dbe35a87b1f8147bb13316ad04f.png

首先我们先创建 产品接口和对应的具体产品

1 public interfaceProduct {2

3 }4

5

6 public class Washer implementsProduct{7

8 publicWasher() {9 System.out.println("洗衣机被制造了");10 }11

12 }13

14

15

16 public class AirCondition implementsProduct{17

18 publicAirCondition() {19 System.out.println("空调被制造了");20 }21 }

然后我们再创建 工厂接口和对应的具体生产不同商品的工厂

public interfaceFactory {

}public class WasherFactory implementsFactory{publicProduct make(){return newWasher();

}

}public class AirConditionFactory implementsFactory{publicProduct make(){return newAirCondition();

}

}

最后就是顾客了,

1 packageFactory2;2

3 public classCustomer {4

5 public static voidmain(String[] args) {6 //TODO Auto-generated method stub

7

8 WasherFactory f=newWasherFactory();9 Product w=f.make();10

11 AirConditionFactory f2=newAirConditionFactory();12 Product w2=f2.make();13 }14 }

运行的结果为:

11e3a7d940dde6b51fe92c87519d3b7a.png

可以理解为:有了很多个工厂方法,自己需要哪一个产品,就调用当前产品的工厂方法,获取相应的具体实例。

从上面创建产品对象的代码可以看出,工厂方法和简单工厂的主要区别是,简单工厂是把创建产品的职能都放在一个类里面,而工厂方法则把不同的产品放在实现了工厂接口的不同工厂类里面,这样就算其中一个工厂类出了问题,其他工厂类也能正常工作,互相不受影响,以后增加新产品,也只需要新增一个实现工厂接口工厂类,就能达到,不用修改已有的代码。但工厂方法也有他局限的地方,那就是当面对的产品有复杂的等级结构的时候,例如,工厂除了生产家电外产品,还生产手机产品,这样一来家电是手机就是两大产品家族了,这两大家族下面包含了数量众多的产品,每个产品又有多个型号,这样就形成了一个复杂的产品树了。如果用工厂方法来设计这个产品家族系统,就必须为每个型号的产品创建一个对应的工厂类,当有数百种甚至上千种产品的时候,也必须要有对应的上百成千个工厂类,这就出现了传说的类爆炸,对于以后的维护来说,简直就是一场灾难.....

抽象方法:

抽象工厂:意的意图在于创建一系列互相关联或互相依赖的对象。

我自己觉得抽象工厂是在工厂方法的基础上引进了分类管理的概念....

工厂方法用来创建一个产品,它没有分类的概念,而抽象工厂则用于创建一系列产品,所以产品分类成了抽象工厂的重点,

我们继续用上面的例子来说明:

工厂生产的所有产品都用都用大写字母来标明它们的型号,比如冰箱,就有“冰箱-A",“冰箱-B",同样,其他的产品也都是遵守这个编号规则,于是就有了一下产品家族树

8c1c9f7097648096b49d36eee37147ed.png

首先:我们创造不同的 电视和鼠标的接口:

1 public interfaceTV {2 }3

4

5 public interfaceMouse {6

7 }

然后我们创造冰箱和鼠标的不同的品种:

1 public class TV_A implementsTV{2

3 publicTV_A() {4 System.out.println("A型TV");5 }6

7 }8

9

10 public class TV_B implementsTV{11

12 publicTV_B() {13 System.out.println("B型TV");14 }15

16 }17

18

19 public class Mouse_A implementsMouse{20

21 publicMouse_A() {22 System.out.println("A型鼠标");23 }24

25 }26

27

28 public class Mouse_B implementsMouse{29

30 publicMouse_B() {31 System.out.println("B型鼠标");32 }33

34 }

最后就等到了不同类型的工厂,生产不同类型的产品。如A工厂只生产A类型的产品

public class Factory_A implementsFactory{

@OverridepublicTV createTv() {//TODO Auto-generated method stub

return newTV_A();

}

@OverridepublicMouse createMouse() {//TODO Auto-generated method stub

return newMouse_A();

}

}public class Factory_B implementsFactory{

@OverridepublicTV createTv() {//TODO Auto-generated method stub

return newTV_B();

}

@OverridepublicMouse createMouse() {//TODO Auto-generated method stub

return newMouse_B();

}

}

最后就是测试类:

1 packageFoctory3;2

3 public classCustomer {4 public static voidmain(String[] args) {5 Factory f=newFactory_A();6 f.createTv();7 f.createMouse();8

9 f=newFactory_B();10 f.createTv();11 f.createMouse();12 }13 }

运行结果如图所示:

7ac9803ee0c4708b13159ce04307a07d.png

欢迎大家一起说出自己的想法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值