设计模式
软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
1.单例模式
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
主要解决:一个全局使用的类频繁地创建与销毁。
何时使用:当您想控制实例数目,节省系统资源的时候。
单例模式有多种写法,常见的是懒汉模式和饿汉模式 饿汉单例模式
饿汉单例模式
优点:没有加锁,执行效率会提高
缺点:类加载时就初始化,浪费内存
编程实现:
私有构造器
静态的私有属性
公共的静态方法
package cutestFox12;
饿汉模式
public class Singleton {
//私有构造能够保证在类外不创建对象
private Singleton() {
}
//保证这个实例只有一个,而且长期持有这个对象
//直接创建对象.私有构造器只能在当前类中进行调用
private static Singleton intance = new Singleton();
//提供统一的访问点
public static Singleton getInstance() {
return intance;
}
}
懒汉单例模式
懒汉式:主要是针对饿汉式中不管是否需要使用对象都先创建对象所引起的内存浪费
优点:由于采用栏延迟处理的方式,所以比较节约内存
缺点:在多线程不能正常工作
package cutestFox12;
//懒汉模式
public class Single2 {
// 私有构造器保证不能随意创建Single2对象
private Single2() {
}
// 静态属性独一无二,保证长期持有
private static Single2 instance;
// 全局访问点
public static Single2 getInstance() {
if (instance == null)
instance = new Single2();
return instance;
}
}
2.模板模式
定义抽象类的目的是提供可由其子类共享的一般形式,子类可以根据自身需要扩展抽象类
什么是模板模式
在模板模式Template Pattern中一个抽象类公开定义了总体的算法【算法骨架】,把没有办法在父类中实现的方法 延迟到子类中具体实现。这种类型的设计模式属于行为型模式
何时使用
有多个子类共有的方法,且逻辑相同
重要的、复杂的方法,可以考虑作为模板方法
注意事项
为防止恶意操作,一般模板方法都加上 nal 关键词
优点
封装不变部分,扩展可变部分 提取公共代码,便于维护 行为由父类控制,子类实现。
缺点
每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
public abstract class BubbleSorter {
//在父类中固化算法实现
public final void sort(Object[]arr) {//final表示这个方法是最终的方法,不允许子类覆盖
for(int i=0;i<arr.length;i++) {
for(int j=0;j<arr.length-i-1;j++) {
if(bigger(arr[j],arr[j+1])) {
Object temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
//定义protected目的是在子类中提供实现
protected abstract boolean bigger(Object obj1,Object obj2);
}
3.装饰模式
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。
1.创建一个接口:
public interface IShape {
void draw();
}
-
创建实现接口的实体类。
public class Circle implements IShape {
public void draw() {
System.out.println(“画一个圆”);
}
} -
创建实现了 Shape 接口的抽象装饰类。
public abstract class DecorateShape implements IShape {
private IShape target;//装饰的目标
public DecorateShape(IShape target) {
this.target=target;
}
public void draw() {
target.draw();} }
-
创建扩展了 ShapeDecorator 类的实体装饰类。
public class RealDecorateShape extends DecorateShape{
public RealDecorateShape(IShape target) {
super(target);}@Override public void draw() { useRed(); super.draw(); } private void useRed() { System.out.println("use red......"); }
}
-
使用 RedShapeDecorator 来装饰 Shape 对象
public class Main {
public static void main(String[] args) {
IShape target = new Circle();
IShape x=new RealDecorateShape(target);
x.draw();
}
}