原型模式
原型模式(创建型模式),核心思想就是:基于一个已有的对象复制一个对象出来,通过复制来减少对象的直接创建的成本。
总结一下,原型模式的两种方法,浅拷贝只会复制对象里面的基本数据类型和引用对象的内存地址,不会递归地复制引用对象,以及引用对象的引用对象。而深拷贝就是会完全拷贝一个新的对象出来。所以,深拷贝的操作会比浅拷贝更加耗时,性能更差一点。同时浅拷贝的代码写起来也比深拷贝的代码写起来更简单一点。如果咱们拷贝的对象是不可变的,也就是说我这个对象只会查看,不会增删改,那么,直接用浅拷贝就好了,如果拷贝的对象存在增删改的情况,那么就需要使用深拷贝了。总而言之,就是要深浅得当,根据项目实际情况而定。
代码举例
java
// 原型接口
interface Shape extends Cloneable {
void draw();
Shape clone();
}
// 具体原型类 - 圆形
class Circle implements Shape {
private String color;
public Circle(String color) {
this.color = color;
}
@Override
public void draw() {
System.out.println("Drawing a circle with color: " + color);
}
@Override
public Shape clone() {
return new Circle(color);
}
}
// 具体原型类 - 正方形
class Square implements Shape {
private String color;
public Square(String color) {
this.color = color;
}
@Override
public void draw() {
System.out.println("Drawing a square with color: " + color);
}
@Override
public Shape clone() {
return new Square(color);
}
}
// 原型管理器
class ShapeCache {
private static Map<String, Shape> shapeMap = new HashMap<>();
public static Shape getShape(String type) {
Shape cachedShape = shapeMap.get(type);
return (Shape) cachedShape.clone();
}
public static void loadCache() {
Circle circle = new Circle("red");
shapeMap.put("circle", circle);
Square square = new Square("blue");
shapeMap.put("square", square);
}
}
// 示例使用
public class PrototypePatternExample {
public static void main(String[] args) {
ShapeCache.loadCache();
Shape clonedShape1 = ShapeCache.getShape("circle");
clonedShape1.draw(); // 输出: Drawing a circle with color: red
Shape clonedShape2 = ShapeCache.getShape("square");
clonedShape2.draw(); // 输出: Drawing a square with color: blue
}
}
模板模式
模板方法模式也非常简单,但是,他却是比较重要的,在很多开源框架里面都用到了这个模式,并且,我们在做项目的时候,也会经常用到这个模式。这个模板方法模式,简单来说就是一句话:在父类中定义业务处理流程的框架,到子类中去做具体的实现。
代码举例
java
// 抽象模板类
abstract class Game {
abstract void initialize();
abstract void startPlay();
abstract void endPlay();
// 模板方法,定义算法框架
public final void play() {
initialize();
startPlay();
endPlay();
}
}
// 具体模板类 - 足球游戏
class FootballGame extends Game {
@Override
void initialize() {
System.out.println("Football Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Playing football...");
}
@Override
void endPlay() {
System.out.println("Football Game Finished!");
}
}
// 具体模板类 - 篮球游戏
class BasketballGame extends Game {
@Override
void initialize() {
System.out.println("Basketball Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Playing basketball...");
}
@Override
void endPlay() {
System.out.println("Basketball Game Finished!");
}
}
// 示例使用
public class TemplatePatternExample {
public static void main(String[] args) {
Game footballGame = new FootballGame();
footballGame.play();
// 输出:
// Football Game Initialized! Start playing.
// Playing football...
// Football Game Finished!
System.out.println();
Game basketballGame = new BasketballGame();
basketballGame.play();
// 输出:
// Basketball Game Initialized! Start playing.
// Playing basketball...
// Basketball Game Finished!
}
}
策略模式
接着我们来看一下策略模式,策略模式呢也是非常简单,他就是定义一个主要的接口,然后很多个类去实现这个接口,比如说我们定义一个文件上传的接口,然后阿里云的上传类去实现它,腾讯云的上传类也去实现它,这样因为都是实现的同一个接口,所以上传类之间是可以在代码中互相替换的。
代码举例
java
// 策略接口
interface Strategy {
int doOperation(int num1, int num2);
}
// 具体策略类 - 加法
class AddStrategy implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
// 具体策略类 - 减法
class SubtractStrategy implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
// 上下文类
class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public int executeStrategy(int num1, int num2) {
return strategy.doOperation(num1, num2);
}
}
// 示例使用
public class StrategyPatternExample {
public static void main(String[] args) {
Context context = new Context(new AddStrategy());
int result1 = context.executeStrategy(10, 5);
System.out.println("10 + 5 = " + result1); // 输出: 10 + 5 = 15
context = new Context(new SubtractStrategy());
int result2 = context.executeStrategy(10, 5);
System.out.println("10 - 5 = " + result2); // 输出: 10 - 5 = 5
}
}
委派模式
委派模式(Delegate Pattern)又叫委托模式,是一种面向对象的设计模式,基本作用就是负责任务的调用和分配;是一种特殊的静态代理,可以理解为全权代理(代理模式注重过程,而委派模式注重结果),委派模式属于行为型模式,不属于GOF23种设计模式;
代码举例
java
// 委派接口
interface Printer {
void print();
}
// 具体委派类 - 打印机A
class PrinterA implements Printer {
@Override
public void print() {
System.out.println("Printer A is printing.");
}
}
// 具体委派类 - 打印机B
class PrinterB implements Printer {
@Override
public void print() {
System.out.println("Printer B is printing.");
}
}
// 委派类
class PrinterManager {
private Printer printer;
public void setPrinter(Printer printer) {
this.printer = printer;
}
public void print() {
printer.print();
}
}
// 示例使用
public class DelegatePatternExample {
public static void main(String[] args) {
PrinterManager printerManager = new PrinterManager();
// 使用打印机A
PrinterA printerA = new PrinterA();
printerManager.setPrinter(printerA);
printerManager.print(); // 输出: Printer A is printing.
System.out.println();
// 使用打印机B
PrinterB printerB = new PrinterB();
printerManager.setPrinter(printerB);
printerManager.print(); // 输出: Printer B is printing.
}
}
适配器模式
适配器模式也比较简单,核心思想就是是:将一个类的接口转换成客户希望的另一个接口,讲白了就是通过适配器可以将原本不匹配、不兼容的接口或类结合起来;
代码举例
java
// 目标接口
interface Target {
void request();
}
// 适配者类
class Adaptee {
public void specificRequest() {
System.out.println("Specific request from Adaptee.");
}
}
// 适配器类
class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void request() {
adaptee.specificRequest();
}
}
// 示例使用
public class AdapterPatternExample {
public static void main(String[] args) {
Adaptee adaptee = new Adaptee();
Target adapter = new Adapter(adaptee);
adapter.request(); // 输出: Specific request from Adaptee.
}
}