一.单例模式1.饿汉式将构造器私有后 无法再new A的对象而外面无法创建A对象了 想通过调用类方法来得到对象 而类方法只会返回类变量a而静态只会执行一次 所以只会有一个对象2.懒汉式3.案例讲解public class Principle { private static Principle principle; public String name; private Principle(String name){ this.namename; } public static Principle getPrinciple(){ if(principlenull){ principlenew Principle(王校长); } return principle; } public void announcement(String message){ System.out.println(name通知了message); } public void approvrDocument(String file){ System.out.println(name审判了file); } }public class School { public static void main(String[] args) { Principle pr1Principle.getPrinciple(); pr1.announcement(放假三天); Principle pr2Principle.getPrinciple(); pr2.approvrDocument(食堂整改文件); if(pr2pr1){ System.out.println(上述两个校长是一个人); }else { System.out.println(上述两个校长不是一个人); } } }二.工厂模式解耦对象创建和使用分离调用者无需知道对象创建细节不用写new IPhone()复用创建逻辑集中在工厂避免重复代码易扩展新增产品只需修改 / 新增工厂不影响业务代码易维护创建逻辑出问题时只需改工厂类不用改所有调用处。三.代理模式为目标对象被代理者提供一个 “代理对象”由代理对象控制对目标对象的访问并可以在访问前后添加额外逻辑比如日志、权限校验、事务而目标对象只需专注于核心业务。静态代理是代理模式的基础版本特点是代理类在编译期就已确定。你目标对象想租房但不想自己找房源、谈价格、签合同额外逻辑只专注于 “住房子”核心业务中介代理对象帮你完成所有额外操作你只需通过中介就能租到房子且中介可以在租房前后加自己的操作比如收中介费、核验身份。静态代理的核心要素共同接口目标类和代理类实现同一个接口定义统一的业务方法目标类实现核心业务逻辑比如租房代理类持有目标类对象重写接口方法在调用目标方法前后添加额外逻辑。// 租房接口定义核心业务方法 public interface RentHouse { // 核心业务租房 void rent(); }// 租客类专注于核心业务租房 public class Tenant implements RentHouse { Override public void rent() { System.out.println(租客我要租朝南、带阳台的房子); // 核心业务逻辑 } }// 中介类代理租客租房添加额外逻辑 public class RentProxy implements RentHouse { // 持有目标对象租客的引用 private RentHouse tenant; // 构造方法传入目标对象 public RentProxy(RentHouse tenant) { this.tenant tenant; } Override public void rent() { // 调用目标方法前额外逻辑前置处理 beforeRent(); // 调用目标对象的核心业务方法 tenant.rent(); // 调用目标方法后额外逻辑后置处理 afterRent(); } // 前置额外逻辑找房源、核验身份 private void beforeRent() { System.out.println(中介帮租客找符合要求的房源核验租客身份); } // 后置额外逻辑签合同、收中介费 private void afterRent() { System.out.println(中介和租客签租房合同收取中介费); } }public class ProxyDemo { public static void main(String[] args) { // 1. 创建目标对象租客 RentHouse tenant new Tenant(); // 2. 创建代理对象中介传入目标对象 RentHouse proxy new RentProxy(tenant); // 3. 调用代理对象的方法实际是中介帮租客完成租房 proxy.rent(); } }优点解耦目标类只关注核心业务额外逻辑日志、权限全部交给代理类代码职责清晰易扩展无需修改目标类代码只需在代理类中添加 / 修改额外逻辑符合 “开闭原则”简单易用编译期确定代理关系代码结构清晰新手易理解。缺点类数量膨胀每一个目标类都需要对应一个代理类比如新增Landlord房东类就要新增LandlordProxy维护成本高如果接口新增方法所有目标类和代理类都要同步修改灵活性低代理关系编译期固定无法动态切换代理逻辑。
java模式
一.单例模式1.饿汉式将构造器私有后 无法再new A的对象而外面无法创建A对象了 想通过调用类方法来得到对象 而类方法只会返回类变量a而静态只会执行一次 所以只会有一个对象2.懒汉式3.案例讲解public class Principle { private static Principle principle; public String name; private Principle(String name){ this.namename; } public static Principle getPrinciple(){ if(principlenull){ principlenew Principle(王校长); } return principle; } public void announcement(String message){ System.out.println(name通知了message); } public void approvrDocument(String file){ System.out.println(name审判了file); } }public class School { public static void main(String[] args) { Principle pr1Principle.getPrinciple(); pr1.announcement(放假三天); Principle pr2Principle.getPrinciple(); pr2.approvrDocument(食堂整改文件); if(pr2pr1){ System.out.println(上述两个校长是一个人); }else { System.out.println(上述两个校长不是一个人); } } }二.工厂模式解耦对象创建和使用分离调用者无需知道对象创建细节不用写new IPhone()复用创建逻辑集中在工厂避免重复代码易扩展新增产品只需修改 / 新增工厂不影响业务代码易维护创建逻辑出问题时只需改工厂类不用改所有调用处。三.代理模式为目标对象被代理者提供一个 “代理对象”由代理对象控制对目标对象的访问并可以在访问前后添加额外逻辑比如日志、权限校验、事务而目标对象只需专注于核心业务。静态代理是代理模式的基础版本特点是代理类在编译期就已确定。你目标对象想租房但不想自己找房源、谈价格、签合同额外逻辑只专注于 “住房子”核心业务中介代理对象帮你完成所有额外操作你只需通过中介就能租到房子且中介可以在租房前后加自己的操作比如收中介费、核验身份。静态代理的核心要素共同接口目标类和代理类实现同一个接口定义统一的业务方法目标类实现核心业务逻辑比如租房代理类持有目标类对象重写接口方法在调用目标方法前后添加额外逻辑。// 租房接口定义核心业务方法 public interface RentHouse { // 核心业务租房 void rent(); }// 租客类专注于核心业务租房 public class Tenant implements RentHouse { Override public void rent() { System.out.println(租客我要租朝南、带阳台的房子); // 核心业务逻辑 } }// 中介类代理租客租房添加额外逻辑 public class RentProxy implements RentHouse { // 持有目标对象租客的引用 private RentHouse tenant; // 构造方法传入目标对象 public RentProxy(RentHouse tenant) { this.tenant tenant; } Override public void rent() { // 调用目标方法前额外逻辑前置处理 beforeRent(); // 调用目标对象的核心业务方法 tenant.rent(); // 调用目标方法后额外逻辑后置处理 afterRent(); } // 前置额外逻辑找房源、核验身份 private void beforeRent() { System.out.println(中介帮租客找符合要求的房源核验租客身份); } // 后置额外逻辑签合同、收中介费 private void afterRent() { System.out.println(中介和租客签租房合同收取中介费); } }public class ProxyDemo { public static void main(String[] args) { // 1. 创建目标对象租客 RentHouse tenant new Tenant(); // 2. 创建代理对象中介传入目标对象 RentHouse proxy new RentProxy(tenant); // 3. 调用代理对象的方法实际是中介帮租客完成租房 proxy.rent(); } }优点解耦目标类只关注核心业务额外逻辑日志、权限全部交给代理类代码职责清晰易扩展无需修改目标类代码只需在代理类中添加 / 修改额外逻辑符合 “开闭原则”简单易用编译期确定代理关系代码结构清晰新手易理解。缺点类数量膨胀每一个目标类都需要对应一个代理类比如新增Landlord房东类就要新增LandlordProxy维护成本高如果接口新增方法所有目标类和代理类都要同步修改灵活性低代理关系编译期固定无法动态切换代理逻辑。