Java常⽤设计模式详解及其优缺点
本⽂将介绍:
简单⼯⼚模式、⼯⼚⽅法模式、抽象⼯⼚模式、静态代理模式、JDK动态代理模式、cglib动态代理模式、策略模式、模板模式、装饰器模式、观察者模式
简单⼯⼚模式
简单⼯⼚模式⼜称为静态⼯⼚⽅法模式,涉及到三个⾓⾊:
1.⼯⼚类⾓⾊:⼯⼚⽅法模式的核⼼,⼯⼚类在客户端的直接调⽤下创建产品对象;
2.抽象产品⾓⾊:由⼯⼚⽅法模式所创建的对象的⽗类,或者它们共有的接⼝;
3.具体产品⾓⾊。
优点:该模式的核⼼是⼯⼚类,该类含有必要的判断逻辑,什么时候创建哪⼀种类的实例,客户端可以免除直接创建产品对象的责任(不⽤直接在客户端new对象),⽽仅仅负责使⽤这个对象,简单⼯⼚模式通过这样的做法实现了对责任的分割。
缺点:扩展困难,由于⼯⼚类含有必要的判断逻辑创建哪个对象,所以违反了“开-闭 原则”。
代码:
⼯⼚类:
public class ShapeFactory {
public static Shape getShape(String shapeType) {
if (shapeType == null) {
return null;
}
if ("Circle".equals(shapeType)) {
return new Circle();
} else if ("Rectangle".equals(shapeType)) {
return new Rectangle();
} else if ("Square".equals(shapeType)) {
return new Square();
}
return null;
}
}
抽象产品类:
public interface Shape {
void draw();
}
具体⼦类:
public class Circle implements Shape{
@Override
public void draw() {
System.out.println("圆形");
}
}
public class Rectangle implements Shape{
@Override
public void draw() {
System.out.println("长⽅形");
java中常用的设计模式有哪些
}
}
public class Square implements Shape{
@Override
public void draw() {
System.out.println("正⽅形");
}
}
客户端使⽤:
public class Main {
public static void main(String[] args) {
Shape circle = Shape("Circle");
circle.draw();
}
}
如果需要新增⼀个新的产品,就需要修改ShapeFactory这个⼯⼚类,影响代码稳定性,对整个系统⽽⾔,⼯⼚模式把具体使⽤new操作符的细节包装盒隐藏起来,在客户端就不必使⽤new来创建具体⾓⾊,下⾯给出类图:
⼯⼚⽅法模式
⼯⼚⽅法模式涉及到的⾓⾊:
1.抽象⼯⼚⾓⾊:(并不是有抽象⼯⼚,就是抽象⼯⼚模式)它与应⽤程序是⽆关的,创建⼯⼚的类必须实现这个接⼝或者继承这个抽象Java类;
2.具体⼯⼚⾓⾊:具体⼯⼚⾓⾊含有与应⽤密切相关的逻辑,并受到应⽤程序的调⽤以创建产品对象;
3.抽象产品⾓⾊:产品对象的共同⽗类或者共同的接⼝;
4.具体产品⾓⾊:实现了抽象产品⾓⾊接⼝,⼯⼚⽅法模式所创建的每⼀个对象都是某个具体产品⾓⾊的实例。
优点:符合 “开-闭 原则”,加⼊新产品是,⽆需修改其他具体⼯⼚和具体产品,只需要添加⼀个具体⼯⼚和具体产品即可。
缺点:⼀定程度上增加了系统的复杂度。
代码:
抽象⼯⼚:(返回的⼀个抽象产品)
public interface Provider {
Shape produce();
}
具体⼯⼚:(实现抽象⼯⼚,及其⽅法返回⼀个具体产品对象)
/**
* 具体⼯⼚-CircleFactory
*/
public class CircleFactory implements Provider {
@Override
public Shape produce() {
return new Circle();
}
}
/**
* 具体⼯⼚-RectangleFactory
*/
public class RectangleFactory implements Provider {
@Override
public Shape produce() {
return new Rectangle();
}
}
/**
* 具体⼯⼚-SquareFactory
*/
public class SquareFactory implements Provider {
@Override
public Shape produce() {
return new Square();
}
}
抽象产品:
public interface Shape {
void draw();
}
具体产品类:(实现抽闲产品接⼝及其⽅法)
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("圆形");
}
}
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("矩形");
}
}
public class Square implements Shape {
@Override
public void draw() {
System.out.println("正⽅形");
}
}
客户端的使⽤:
public class Main {
public static void main(String[] args) {
Provider circleProvider = new CircleFactory();
Shape circle = circleProvider.produce();
circle.draw();
Provider squareProvider = new SquareFactory();
Shape square = squareProvider.produce();
square.draw();
}
}
produce()⽅法返回的是⼀个抽象类型Shape,⽽不是具体的哪⼀个产品,⽽客户端也不必知道所得到的产品的真是类型,这种多态性设计将⼯⼚类选择创建哪⼀个产品,如何创建这个对象的细节完全封装在具体⼯⼚类的内部。
如果想新增⼀种产品,只需要新增⼀个具体产品类和对应的具体⼯⼚类即可,不需要修改其他代码。下⾯给出类图:
当抽象⼯⼚只有⼀种的时候,再把⼯⼚类创建的⽅法设置为静态⽅法,就演变成了简单⼯⼚模式。⼯⼚⽅法模式的别名:多态性⼯⼚模式,是因为具体⼯⼚类都有共同的接⼝或者共同的抽象⽗类。
抽象⼯⼚模式
/**
* 抽象产品-空调
*/
public interface IAirconditioner {
/**
* 制冷
*/
void cryogen();
}
/**
* 抽象产品-冰箱
*/
public interface IRefrigerator {
/**
* 保存⾷品
*/
void preserveFood();
}
具体产品:
public class HaierRefrigerator implements IRefrigerator {
@Override
public void preserveFood() {
System.out.println("海尔冰箱保存⾷品!");
}
}
public class GreeRefrigerator implements IRefrigerator {
@Override
public void preserveFood() {
System.out.println("格⼒冰箱保存⾷品!");
}
}
public class HaierAirConditioner implements IAirconditioner { @Override
public void cryogen() {
System.out.println("海尔空调制冷!");
}
}
public class GreeAirConditioner implements IAirconditioner { @Override
public void cryogen() {
System.out.println("格⼒空调制冷!");
}
}
抽象⼯⼚:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论