设计模式
创造型模式(关注于对象的创建,同时隐藏创建逻辑):工厂模式,抽象工厂模式,单例模式,建造者模式,原型模式
结构型模式(关注类和对象之间的组合):适配器模式,过滤器模式,装饰模式,享元模式,代理模式,外观模式,组合模式,桥接模式
行为型模式(关注对象之间的通信):责任链模式,命令模式,中介者模式,观察者模式,状态模式,测类模式,模板模式,空对象模式,备忘录模式,迭代器模式,解释器模式,访问者模式
单例模式
单例对象的类必须保证只有一个实例存在,整个系统只能使用一个对象实例。
优点:不会频繁地创建和销毁对象,浪费系统资源
使用场景:IO,数据库连接,Redis连接等
简单工厂模式
又叫静态工厂方法模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建,不需要管内部的具体实现
class Factory {
public static String createProduct(String product) {
String result = null;
switch (product) {
case "Mocca":
result = "摩卡";
break;
case "Latte":
result = "拿铁";
break;
default:
result = "其他";
break;
}
return result;
}
}
抽象工厂模式
是在简单工厂的基础上将未来可能需要修改的代码抽象出来,通过继承的方法让子类去做决定
public class AbstractFactoryTest {
public static void main(String[] args) {
// 抽象工厂
String result = (new CoffeeFactory()).createProduct("Latte");
System.out.println(result); // output:拿铁
}
}
// 抽象工厂
abstract class AbstractFactory{
public abstract String createProduct(String product);
}
// 啤酒工厂
class BeerFactory extends AbstractFactory{
@Override
public String createProduct(String product) {
String result = null;
switch (product) {
case "Hans":
result = "汉斯";
break;
case "Yanjing":
result = "燕京";
break;
default:
result = "其他啤酒";
break;
}
return result;
}
}
/* * 咖啡工厂 */
class CoffeeFactory extends AbstractFactory{
@Override
public String createProduct(String product) {
String result = null;
switch (product) {
case "Mocca":
result = "摩卡";
break;
case "Latte":
result = "拿铁";
break;
default:
result = "其他咖啡";
break;
}
return result;
}
}
观察者模式
定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。
优点:实现表示层和数据逻辑层的分离,并定义了问帝国的消息更新传递机制
在观察目标和观察者之间建立一个抽象的耦合
支持广播通信
符合开闭原则(对扩展开放,对修改关闭)
装饰器模式
指动态地给一个对象增加一些额外的功能,同时又不改变其结构
优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能
模板方法模式
指定义一个模板结构,将具体内容延迟到子类去实现
优点:
提高了代码的复用性:将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中
实现了反向控制:通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制并且符合开闭原则
代理模式
是给某一个对象提供一个代理,并且由代理对象控制对原对象的引用
优点:降低系统的耦合度,可隐藏被代理对象的部分功能和服务,也可增加额外的功能和服务
适配器模式
将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而无法一起工作的两个类能够一起工作
Spring中用了哪些设计模式
代理模式:在AOP中
单例模式:bean默认是单例模式
模板方法模式:jdbcTemplate
共舱模式:BeanFactory
观察者模式:Spring事件驱动模型,比如ContextStartedEvent就是ApplicationContext启动后触发的事件
适配器模式:Spring MVC中应用到了适配器模式适配Controller
IO使用了什么设计模式
适配器模式:由于InputStream是字节流不能享受到字符流读取字符那么便捷的功能,借助InputStreamReader将其转为Reader子类,,因而可以拥有便携操作文本文件方法
装饰器模式:将InputStream字节流包装为其他流的过程就是装饰器模式,比如包装为FileInputStream,ByteArrayInputStream等
JDK常用的设计模式
工厂模式
java.text.DateFormat工具类,用于格式化一个本地日期或时间
public final static DateFormat getDateInstance();
public final static DateFormat getDateInstance(int style);
public final static DateFormat getDateInstance(int style,Locale locale);
适配器模式
把其他类适配为集合类
List
List
代理模式
JDK自身的动态代理
单例模式——全局只允许有一个实例,比如:Runtime.getRuntime()
装饰器模式
为一个对象动态的加上一系列的动作,而不需要因为这些动作的不同而产生大量的继承类
java.io.BufferedInputStream(InputStream);
java.io.DataInputStream(InputStream);
java.io.BufferedOutputStream(OutputStream);
java.util.zip.ZipOutputStream(OutputStream);
java.util.Collections.checkedList(List list, Class type) ;
模板方法模式
定义一个操作中算法的骨架,将一些步骤的执行延迟到其子类中,比如Arrays.sort(),要求实现Comparable接口
class Person implements Comparable{
private Integer age;
public Person(Integer age){
this.age = age;
}
@Override
public int compareTo(Object o) {
Person person = (Person)o;
return this.age.compareTo(person.age);
}
}
public class SortTest(){
public static void main(String[] args){
Person p1 = new Person(10);
Person p2 = new Person(5);
Person p3 = new Person(15);
Person[] persons = {p1,p2,p3};
//排序
Arrays.sort(persons);
}
}