内容简介:使用一个统一的工厂类,以鼠标为例子,有戴尔鼠标,有惠普鼠标是对一些业务代码的简单优化(简单不一定就不好)工厂方法模式把具体产品的创建推迟到工厂类的子类(具体工厂)中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口
使用一个统一的工厂类,以鼠标为例子,有戴尔鼠标,有惠普鼠标
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厂商这个父类中,增加生产耳麦的接口。最后在戴尔工厂,惠普工厂这两个类中,分别实现生产戴尔耳麦,惠普耳麦的功能。 以上。
优点
其实是对于产品族(多种产品由于业务原因有内在聚合性,比如都是戴尔家的)情况下,工厂方法模式的拓展.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 设计模式——订阅模式(观察者模式)
- 设计模式-简单工厂、工厂方法模式、抽象工厂模式
- java23种设计模式-门面模式(外观模式)
- 设计模式-享元设计模式
- Java 设计模式之工厂方法模式与抽象工厂模式
- JAVA设计模式之模板方法模式和建造者模式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java语言程序设计(基础篇 原书第10版)
[美]粱勇(Y.Daniel Liang) / 戴开宇 / 机械工业出版社 / 2015-7 / 85.00元
《Java语言程序设计(基础篇 原书第10版)》是Java语言的经典教材,中文版分为基础篇和进阶篇,主要介绍程序设计基础、面向对象编程、GUI程序设计、数据结构和算法、高级Java程序设计等内容。本书以示例讲解解决问题的技巧,提供大量的程序清单,每章配有大量复习题和编程练习题,帮助读者掌握编程技术,并应用所学技术解决实际应用开发中遇到的问题。您手中的这本是其中的基础篇,主要介绍了基本程序设计、语法......一起来看看 《Java语言程序设计(基础篇 原书第10版)》 这本书的介绍吧!
RGB转16进制工具
RGB HEX 互转工具
html转js在线工具
html转js在线工具