设计模式可以分为三种:
1、创建型模式
这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。有5种:
工厂模式(Factory Pattern)
抽象工厂模式(Abstract Factory Pattern)
单例模式(Singleton Pattern)
建造者模式(Builder Pattern)
原型模式(Prototype Pattern)
2、结构型模式
这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。有7种:
适配器模式(Adapter Pattern)
桥接模式(Bridge Pattern)
组合模式(Composite Pattern)
装饰器模式(Decorator Pattern)
外观模式(Facade Pattern)
享元模式(Flyweight Pattern)
代理模式(Proxy Pattern)
3、行为型模式
这些设计模式特别关注对象之间的通信。有11种:
责任链模式(Chain of Responsibility Pattern)
命令模式(Command Pattern)
解释器模式(Interpreter Pattern)
迭代器模式(Iterator Pattern)
中介者模式(Mediator Pattern)
备忘录模式(Memento Pattern)
观察者模式(Observer Pattern)
状态模式(State Pattern)
策略模式(Strategy Pattern)
模板模式(Template Pattern)
访问者模式(Visitor Pattern)
一、模板模式(Template Pattern)
模板模式指的是一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。模板模式事实上才是使用得最多的设计模式,几乎所有OOP的代码都会有意无意碰到。我们以来修房子作为一个例子。
public class DesignPattern {
public static void main(String[] args) {
BuildHouse flat=new BuildFlat();
BuildHouse hotel=new BuildHotel();
flat.build();
System.out.println();
hotel.build();
}
}
abstract class BuildHouse{
protected void start(){//start和end方法的定义在抽象类中,不需要子类覆盖
System.out.println("开始建房子啦");
}
protected abstract void buildpool();//需要子类覆盖接下来的三个方法。这些方法由于用户不需要调用,只会由子类覆盖,所以protected
protected abstract void buildwall();
protected abstract void buildroof();
protected void end(){
System.out.println("建完房子啦");
}
protected boolean isrich() {//钩子方法。钩子方法一般是在抽象类中实现或者在接口中,可以由子类覆盖。他的作用顾名思义,像一个钩子,决定某些方法能否被执行
return true;
}
final public void build(){//build就是所谓模板方法,他决定了方法的具体执行。也就是说方法的具体执行交给抽象类而不是子类,子类只需要覆盖方法的各个步骤的具体实现
//由于具体方法的执行是不能被更改的,所以要用final。由于用户要调用他,所以需要public
this.start();
if(this.isrich())
this.buildpool();
this.buildwall();
this.buildroof();
this.end();
}
}
class BuildFlat extends BuildHouse{
@Override
protected void buildpool() {
System.out.println("建一个公寓游泳池");
}
@Override
protected void buildwall(){
System.out.println("建一个公寓墙壁");
}
@Override
protected void buildroof(){
System.out.println("建一个公寓屋顶");
}
@Override
protected boolean isrich(){//建公寓,那肯定没什么钱,那就别建游泳池了
return false;
}
}
class BuildHotel extends BuildHouse{
@Override
protected void buildpool() {
System.out.println("建一个酒店游泳池");
}
@Override
protected void buildwall(){
System.out.println("建一个酒店墙壁");
}
@Override
protected void buildroof(){
System.out.println("建一个酒店屋顶");
}
}
优点: 1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。
缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
使用场景:1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。
二、单例模式(Singleton Pattern)
单例模式是 Java 中最简单的设计模式之一。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被