内容简介:使用一个统一的工厂类,以鼠标为例子,有戴尔鼠标,有惠普鼠标是对一些业务代码的简单优化(简单不一定就不好)工厂方法模式把具体产品的创建推迟到工厂类的子类(具体工厂)中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口
使用一个统一的工厂类,以鼠标为例子,有戴尔鼠标,有惠普鼠标
public class MouseFactory {
public static final String TAG = "MouseFactory";
public static Mouse getMouse(String type) {
Mouse mouse = null;
if (type.equalsIgnoreCase("dell")) {
mouse = new DellMouse();
} else if (type.equalsIgnoreCase("hp")) {
mouse = new HpMouse();
}
return mouse;
}
}
复制代码
优点
是对一些业务代码的简单优化(简单不一定就不好)
缺点
- 工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响;
- 违背“开放 - 关闭原则”,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂。
- static 静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构
工厂方法模式(最常用)
工厂方法模式把具体产品的创建推迟到工厂类的子类(具体工厂)中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口
写法
工厂模式也就是鼠标工厂是个父类,有生产鼠标这个接口。
戴尔鼠标工厂,惠普鼠标工厂继承它,可以分别生产戴尔鼠标,惠普鼠标。
生产哪种鼠标不再由参数决定,而是创建鼠标工厂时,由戴尔鼠标工厂创建。
产品的公共接口
public interface Mouse {
void move();
}
复制代码
具体实现类
public class DellMouse implements Mouse {
@Override
public void move() {
System.out.print("dell move");
}
}
public class HpMouse implements Mouse {
@Override
public void move() {
System.out.print("hp move");
}
}
复制代码
抽象的工厂接口MouseFactory
public interface MouseFactory {
Mouse getMouse();
}
复制代码
具体工厂
public class DellMouseFactory implements MouseFactory {
@Override
public Mouse getMouse() {
return new DellMouse();
}
}
public class HpMouseFactory implements MouseFactory {
@Override
public Mouse getMouse() {
return new HpMouse();
}
}
复制代码
使用
// 戴尔鼠标 MouseFactory factory=new DellMouseFactory(); Mouse mouse=factory.getMouse(); mouse.move(); // 惠普鼠标 MouseFactory factory=new HpMouseFactory(); Mouse mouse=factory.getMouse(); mouse.move(); 复制代码
优点
- 更符合开-闭原则 新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可
- 符合单一职责原则 每个具体工厂类只负责创建对应的产品
缺点
- 一个具体工厂只能创建一种具体产品
- 添加新产品时,除了增加新产品类外,还要提供与之对应的具体工厂类,系统类的个数将成对增加 如果没有更复杂的需要,工厂方法模式就够了.
抽象工厂模式
一个工厂往往需要生产多类产品
值得注意的是,这时的工厂就不仅仅是鼠标工厂那种单一的概念了,它是更多的是一种"平台",比如linux/win, 或者品牌,华硕/戴尔/惠普工厂.
写法
抽象工厂模式也就是不仅生产鼠标,同时生产键盘。
也就是 PC 厂商是个父类,有生产鼠标,生产键盘两个接口。
戴尔工厂,惠普工厂继承它,可以分别生产戴尔鼠标+戴尔键盘,和惠普鼠标+惠普键盘。
创建工厂时,由戴尔工厂创建。
后续工厂.生产鼠标()则生产戴尔鼠标,工厂.生产键盘()则生产戴尔键盘。
这里的代码不继续给了,只是在抽象的工厂接口中,定义多个产品.
在抽象工厂模式中,假设我们需要增加一个工厂
假设我们增加华硕工厂,则我们需要增加华硕工厂,和戴尔工厂一样,继承 PC 厂商。
之后创建华硕鼠标,继承鼠标类。创建华硕键盘,继承键盘类即可。
在抽象工厂模式中,假设我们需要增加一个产品
假设我们增加耳麦这个产品,则首先我们需要增加耳麦这个父类,再加上戴尔耳麦,惠普耳麦这两个子类。
之后在PC厂商这个父类中,增加生产耳麦的接口。最后在戴尔工厂,惠普工厂这两个类中,分别实现生产戴尔耳麦,惠普耳麦的功能。 以上。
优点
其实是对于产品族(多种产品由于业务原因有内在聚合性,比如都是戴尔家的)情况下,工厂方法模式的拓展.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
黑客简史:棱镜中的帝国
刘创 / 电子工业出版社 / 2015-1 / 39.80元
“黑客”,伴随着计算机和互联网而诞生,他们掌握着前沿的计算机和网络技术,能够发现并利用计算机系统和网络的弱点,他们的行为动机多样,因此我们必须对这一群体进行分解,认识他们及其技术的两面性——“黑客”中那些不断拓展技术边界、富于创造力的,和那些掌握技术、却利欲熏心的,就像硬币的两面,谁都无法清晰地辨别是非。相对于主流文化,黑客的行为方式和理念等形成了一种“亚文化”,与主流文化相互作用。一起来看看 《黑客简史:棱镜中的帝国》 这本书的介绍吧!