文章目录
设计模式
设计原则
单一职责
- 一个方法只负责一件事情
开闭原则:
- 尽量通过扩展软件实体来解决需求变化,而不是通过修改已有的代码来完成变化
里氏替换原则
- 子类可以扩展父类的功能,但不能改变父类原有的功能。子类可以实现父类的抽象方
法,但不能覆盖父类的非抽象方法,子类中可以增加自己特有的方法
接口隔离原则
- 客户不应该依赖于它所不需要的接口,使用多个隔离的接口,比使用单个接口要好
迪米特法则(最少知道原则)
- 一个类尽量减少自己对其他对象的依赖
创建型模式
单例模式
- 饿汉模式(Early Instantiation of Singleton Pattern)
借助于JVM类加载机制,初始化阶段就完成了实例的初始化,保证实例的唯一性(初始化过程只会执行一次),线程安全(JVM以同步的方式完成类加载的整个过程)
public class Singleton {
private Singleton(){
}
private static final Singleton INSTANCE = new Singleton();
public static Singleton getInstance() {
return INSTANCE;
}
}
- 懒汉模式(Lazy Instantiation of Singleton Pattern)
public class Singleton {
private volatile static Singleton instance;
public static Singleton getInstance() {
if(instance == null) {
synchronized (Singleton.class) {
if(instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
- 静态内部类
结合了懒汉式和饿汉式各自的优点,真正需要对象的时候才会加载,加载类是线程
安全的。
/**
*通过静态内部类的方式懒加载获取线程安全的实例
*/
public class ResourceFactory {
private static class ResourceHolder{
public static ResourceFactory instance = new ResourceFactory();
}
public static ResourceFactory getResource() {
return ResourceHolder.instance;
}
}
工厂方法模式
工厂方法(Factory Method Pattern )
创建实例的职责交给子类
public abstract class Plan {
protected double rate;
abstract void getRate();
public void calculateBill(int unit) {
System.out.println(unit * rate);
}
}
class DomesticPlan extends Plan {
@Override
void getRate() {
rate = 3.50;
}
}
class CommercialPlan extends Plan {
@Override
void getRate() {
rate = 7.50;
}
}
class InstitutionalPlan extends Plan {
@Override
public void getRate() {
rate = 5.50;
}
}
public class GetPlanFactory {
public Plan getPlan(String planType) {
if (planType == null) {
return null;
}
if (planType.equalsIgnoreCase("DOMESTICPLAN")) {
return new DomesticPlan();
} else if (planType.equalsIgnoreCase("COMMERCIALPLAN")) {
return new CommercialPlan();
} else if (planType.equalsIgnoreCase("INSTITUTIONALPLAN")) {
return new InstitutionalPlan();
}
return null;
}
public static void main(String args[]) throws IOException {
GetPlanFactory planFactory = new GetPlanFactory();
System.out.print("Enter the name of plan for which the bill will be generated: ");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String planName = br.readLine();
System.out.print("Enter the number of units for bill will be calculated: ");
int units = Integer.parseInt(br.readLine());
Plan p = planFactory.getPlan(planName);
System.out.print("Bill amount for " + planName + " of " + units