常用设计模式
设计模式
介绍
理解:设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。
常用设计模式:
创建型模式,共5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共7种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共11种:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
单例设计模式
理解:所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例。
饿汉式
实现步骤:
- 私有化构造器,不让外部直接创建对象
- 内部声明私有的类变量创建类的对象
- 提供公共方法返回类的对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class Bank{ private Bank(){ } private static Bank instance = new Bank(); public static Bank getInstance(){ return instance; } }
|
懒汉式
实现步骤:
- 私有化构造器,不让外部直接创建对象
- 内部声明私有的类变量
- 提供公共方法返回类的对象,在方法内创建对象赋值给类变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Order{ private Order(){ } private static Order instance = null; public static Order getInstance(){ if(instance == null){ instance = new Order(); } return instance; } }
|
两种方式的对比
- 饿汉式:
- 懒汉式:
- 好处:延迟对象的创建
- 目前的写法坏处:线程不安全。—>到多线程内容时,再修改
使用场景

代理设计模式
理解:代理模式是Java开发中使用较多的一种设计模式。代理设计模式就是为其他对象提供一种代理以控制对这个对象的访问。
静态代理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| public class ProxyTest { public static void main(String[] args) { RealStarProxy realStarProxy = new RealStarProxy(new RealStar()); realStarProxy.confer(); realStarProxy.bookTicket(); realStarProxy.collectMoney(); realStarProxy.sing(); realStarProxy.signContract(); } }
interface Star{ void confer();
void signContract();
void bookTicket();
void sing();
void collectMoney(); }
class RealStar implements Star{
@Override public void confer() {
}
@Override public void signContract() {
}
@Override public void bookTicket() {
}
@Override public void sing() { System.out.println("明星:唱歌~~~~"); }
@Override public void collectMoney() {
} }
class RealStarProxy implements Star{ private Star real;
public RealStarProxy(Star real){ this.real = real; }
@Override public void confer() { System.out.println("经纪人面谈"); }
@Override public void signContract() { System.out.println("经纪人签合同"); }
@Override public void bookTicket() { System.out.println("经纪人订票"); }
@Override public void sing() { real.sing(); }
@Override public void collectMoney() { System.out.println("经纪人收钱"); } }
|
使用场景

模板方法设计模式
理解:抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象 类的行为方式。
解决的问题:
- 当功能内部一部分实现是确定的,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现
- 在软件开发中实现一个算法时,整体步骤很固定、通用, 这些步骤已经在父类中写好了。但是某些部分易变,易变部分可以抽象出来,供不同子类实现。这就是一种模板模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| public class TemplateMethodTest { public static void main(String[] args) { SubTemplate subTemplate = new SubTemplate(); subTemplate.spendTime(); } }
abstract class Template{ public void spendTime(){ long start = System.currentTimeMillis(); code(); long end = System.currentTimeMillis(); System.out.println("执行花费时间为:"+(end-start)); } public abstract void code(); }
class SubTemplate extends Template{
@Override public void code() { for (int i = 2; i <= 1000; i++) { boolean flag = true; for (int j = 2; j <= i/2; j++) { if(i % j == 0){ flag = false; break; } } if(flag) System.out.print(i+" "); } } }
|
使用场景
