java的工厂类_Java中的工厂模式

设计模式遵循原则

开闭原则:对扩展开放,对修改关闭

里氏代换原则:只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被覆用。而衍生类也能够在基类的基础上增加新的行为

依赖倒转原则:开闭原则的基础,对接口编程,依赖于抽象而不依赖于具体

接口隔离原则:使用多个隔离的接口来降低耦合度

迪米特法原则:最少知道原则。一个实体应该尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立

合成复用原则:尽量使用合成/聚合的方式,而不是使用继承。继承实际上破环了类的封装性,超类的方法可能会被子类修改。

工厂模式

简单工厂模式

643aec38a0d4f426fd995036b5609253.png

简单工厂模式当中,一个工厂负责生产所有的产品。如上图所示,无论是戴尔鼠标还是惠普鼠标,都在一家鼠标工厂中生产。工厂通过用户的需要生产不同的鼠标,即用户传入生产鼠标的参数,工厂返回生产出的鼠标实体。

具体实现如下:

//鼠标基类

classMouse{public voidsayHi(){};

}//鼠标扩展类

class DellMouse extendsMouse{

@Overridepublic voidsayHi() {

System.out.println("产品:戴尔鼠标");

}

}class HpMouse extendsMouse{

@Overridepublic voidsayHi() {

System.out.println("产品:惠普鼠标");

}

}//鼠标工厂

classMouseFactory{//生产鼠标的方法,所有的鼠标都通过该方法生成

public static Mouse createMouse(inti) {switch(i) {case 0: return newDellMouse();case 1: return newHpMouse();default: return null;

}

}

}public classNormFactory {public static voidmain(String[] args) {

Mouse hpm= MouseFactory.createMouse(1);

Mouse dellm= MouseFactory.createMouse(0);

hpm.sayHi();

dellm.sayHi();

}

}

打印结果如下:

产品:惠普鼠标

产品:戴尔鼠标

上述模式下,所有的鼠标都在同一个MouseFactory工厂下生产,有一个统一的create静态方法。在使用工厂时,不需要对工厂进行实例化,只需要调用该静态方法便可得到相应的产品。

但如果用户需要添加新一类的产品,例如有一项华硕鼠标,工厂要生产该产品则需要改create函数,这有悖于设计原则的开闭原则。

工厂模式

9888caba3fb25b27886f5f467a061d5d.png

在该模式下,不同品牌的产品交由不同的工厂来生产,有一个统一的工厂接口,生产该产品的工厂都要实现该接口。

生产哪种产品不再由参数决定,而是在创建工厂时让工厂来决定,例如惠普的工厂只会生产惠普的鼠标,而戴尔的工厂只会生产戴尔的鼠标。

具体实现如下:

classMouse{public voidsayHi(){};

}class DellMouse extendsMouse{

@Overridepublic voidsayHi() {

System.out.println("产品:戴尔鼠标");

}

}class HpMouse extendsMouse{

@Overridepublic voidsayHi() {

System.out.println("产品:惠普鼠标");

}

}//生产工厂接口

interfaceMouseFactory{publicMouse createMouse();

}//不同的鼠标交由不同的工厂生产

class HpMouseFactory implementsMouseFactory{

@OverridepublicMouse createMouse() {return newHpMouse();

}

}class DellMouseFactory implementsMouseFactory{

@OverridepublicMouse createMouse() {return newDellMouse();

}

}public classNormFactory {public static voidmain(String[] args) {

MouseFactory hpFact= newHpMouseFactory();

MouseFactory dellFact= newDellMouseFactory();

Mouse hpm=hpFact.createMouse();

Mouse dellm=dellFact.createMouse();

hpm.sayHi();

dellm.sayHi();

}

}

打印结果如下:

产品:惠普鼠标

产品:戴尔鼠标

该模式下代码的可扩展性大大提高,当需要添加一种商品时,只需要添加生产该商品的工厂,并让其实现生产工厂接口即可。

但在该模式下,商品的生产变得更为复杂,我们要得到一件商品,必须先得到一座生产该商品的工厂,再调用该工厂的生产方法才能得到该商品。

抽象工厂模式

87c8f4e9ba3537f6b6a2e7980027b6a1.png

该模式下的工厂生产的产品不唯一,同一品牌的工厂有着各种不同的产品,相当于是工厂模式的一个加强版。

具体实现如下:

classMouse{public voidsayHi(){};

}class DellMouse extendsMouse {

@Overridepublic voidsayHi() {

System.out.println("产品:戴尔鼠标");

}

}class HpMouse extendsMouse {

@Overridepublic voidsayHi() {

System.out.println("产品:惠普鼠标");

}

}classKeyBoard {public voidkick(){};

}class HpKeyBoard extendsKeyBoard {

@Overridepublic voidkick() {

System.out.println("产品:惠普键盘");

}

}class DellKeyBoard extendsKeyBoard {

@Overridepublic voidkick() {

System.out.println("产品:戴尔键盘");

}

}//总的工厂接口

interfacePcFactory {publicMouse createMouse() ;publicKeyBoard createKeyBoard() ;

}class HpFactory implementsPcFactory {

@OverridepublicMouse createMouse() {return newHpMouse();

}

@OverridepublicKeyBoard createKeyBoard() {return newHpKeyBoard();

}

}class DellFactory implementsPcFactory {

@OverridepublicMouse createMouse() {return newDellMouse();

}

@OverridepublicKeyBoard createKeyBoard() {return newDellKeyBoard();

}

}//当需要增加一个华硕工厂时:

class AsusMouse extendsMouse {

@Overridepublic voidsayHi() {

System.out.println("产品:华硕鼠标");

}

}class AsusKeyBoard extendsKeyBoard {

@Overridepublic voidkick() {

System.out.println("产品:华硕键盘");

}

}class AsusFactory implementsPcFactory {

@OverridepublicMouse createMouse() {return newAsusMouse();

}

@OverridepublicKeyBoard createKeyBoard() {return newAsusKeyBoard();

}

}public classNormFactory {public static voidmain(String[] args) {

PcFactory hpFact= newHpFactory();

Mouse hpm=hpFact.createMouse();

KeyBoard hpkbd=hpFact.createKeyBoard();

PcFactory dellFact= newDellFactory();

Mouse dellm=dellFact.createMouse();

KeyBoard dellkbd=dellFact.createKeyBoard();

hpm.sayHi();

dellm.sayHi();

hpkbd.kick();

dellkbd.kick();

}

}

打印结果如下:

产品:惠普鼠标

产品:戴尔鼠标

产品:惠普键盘

产品:戴尔键盘

但该模式如果要添加产品时,需要修改PcFactory、DellFactory、HpFactory等所有实现了PcFactroy接口的工厂类,这是十分不好的。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值