设计模式: 对比简单工厂模式、策略模式和模板模式
策略模式
代码看这篇:设计模式: 一个简单的策略模式demo
简单工厂模式
- 定义一个接口Pen
- 多个Pen接口的实现类
- 定义工厂类factory根据参数创建Pen实例
- 客户端通过factory创建的实例去调用具体方法
定义一个接口Pen
public interface Pen {
void write(String content);
}
多个Pen接口的实现类
public class Pencil implements Pen {
@Override
public void write(String content) {
System.out.println("我是铅笔,我正在写:" + content);
}
}
public class FountainPen implements Pen {
@Override
public void write(String content) {
System.out.println("我是钢笔,我正在写:" + content);
}
}
public class Quill implements Pen {
@Override
public void write(String content) {
System.out.println("我是毛笔,我正在写:" + content);
}
}
定义工厂类factory根据参数创建Pen实例
@Component
public class PenFactory {
public Pen createPen(String type) {
if ("pencil".equalsIgnoreCase(type)) {
return new Pencil();
} else if ("quill".equalsIgnoreCase(type)) {
return new Quill();
} else {
return new FountainPen();
}
}
}
客户端通过factory创建的实例去调用具体方法
@Override
public void designFactoryTest(String type, String content) {
Pen pen = penFactory.createPen(type);
pen.write(content);
}
模板模式
- 抽象父类(Abstract Class):定义了模板方法和一些抽象方法或具体方法。
- 具体子类(Concrete Classes):继承自抽象父类,并实现抽象方法。
- 钩子方法(Hook Method)(可选):在抽象父类中定义,可以被子类重写,以影响模板方法的行为。
- 客户端(Client)(可选):使用抽象父类和具体子类,无需关心模板方法的细节
抽象父类
public abstract class PrintNumTemplate {
public void run(int num) {
start();
print(num);
end();
}
abstract void start();
abstract void print(int num);
abstract void end();
}
具体子类和钩子方法具体实现
public class EvenNum extends PrintNumTemplate{
@Override
void start() {
System.out.println("我是一个偶数");
}
@Override
void print(int num) {
System.out.println("偶数:" + num);
}
@Override
void end() {
System.out.println("偶数打印完成");
}
}
public class OddNum extends PrintNumTemplate{
@Override
void start() {
System.out.println("我是一个奇数");
}
@Override
void print(int num) {
System.out.println("奇数:" + num);
}
@Override
void end() {
System.out.println("奇数打印完成");
}
}
客户端(Client)
@Override
public void designTemplateTest(int num) {
PrintNumTemplate printNumTemplate = null;
if (num % 2 == 0) {
printNumTemplate = new EvenNum();
} else {
printNumTemplate = new OddNum();
}
printNumTemplate.run(num);
}
对比
模板方法比较好理解,就是通过抽象类定义模板,通过钩子方法来实现不同的行为。
工厂模式和策略模式对比:工厂模式和策略模式区别以及使用
- 核心思想不同:
工厂模式的核心是创建对象,而策略模式的核心是定义一系列可互相替换的算法。
工厂模式关注的是对象的创建过程,策略模式关注的是如何使用这些对象。 - 应用场景不同:
工厂模式通常用于对象的创建和管理。
策略模式用于定义算法族,让它们之间可以互相替换。 - 目的和结构:
工厂模式目的是为了降低对象创建的复杂性,结构上通常包含一个工厂类和多个产品类。
策略模式目的是为了定义策略的多样性,结构上包含策略接口、具体策略类、上下文环境和客户端。 - 使用时机:
工厂模式在对象创建时被调用。
策略模式在对象使用时被调用,以决定具体使用哪个策略。 - 灵活性和可扩展性:
工厂模式可以很容易地引入新的产品类型(需要创建新的产品类和增加工厂类中创建的产品类型),但可能会导致工厂类的复杂性增加。
策略模式可以很容易地引入新的策略(只需要创建新的策略类),而且不会影响到已有的策略实现。