1. 单例模式

1.1 饿汉式

  1. class HungrySingleton{
  2. private static HungrySingletonTest instance = new HungrySingletonTest();
  3. private HungrySingleton(){}
  4. public static HungrySingletonTest getInstance() {
  5. return instance;
  6. }
  7. }

1.2 懒汉式

  1. class LazySingleton{
  2. private static volatile LazySingleton instance;
  3. private LazySingleton(){}
  4. public static LazySingleton getInstance() {
  5. if (instance == null){
  6. synchronized (LazySingleton.class){
  7. if (instance == null)
  8. instance = new LazySingleton();
  9. }
  10. }
  11. return instance;
  12. }
  13. }

1.3 内部类式

  1. class InnerClassSingleton{
  2. // 此静态内部类只会在第一次调用getInstance()方法时进行加载和初始化
  3. private static class InnerClassHolder{
  4. private static InnerClassSingleton instance = new InnerClassSingleton();
  5. }
  6. private InnerClassSingleton(){
  7. // 防止通过反射获取新实例
  8. if (InnerClassHolder.instance != null){
  9. throw new RuntimeException("单例模式不允许创建多个实例");
  10. }
  11. }
  12. public static InnerClassSingleton getInstance(){
  13. return InnerClassHolder.instance;
  14. }
  15. }

2. 简单工厂

  1. class ProductSimpleFactory{
  2. public static Product getProduct(String type){
  3. if ("ProductA".equals(type)){
  4. return new ProductA();
  5. }else if ("ProductB".equals(type)){
  6. return new ProductB();
  7. }else {
  8. return null;
  9. }
  10. }
  11. }
  12. interface Product{
  13. public void produce();
  14. }
  15. class ProductA implements Product{
  16. @Override
  17. public void produce() {
  18. System.out.println("A产品被生产出来了");
  19. }
  20. }
  21. class ProductB implements Product{
  22. @Override
  23. public void produce() {
  24. System.out.println("B产品被生产出来了");
  25. }
  26. }

3. 工厂方法

  1. // 工厂接口
  2. interface CarFactory{
  3. Car getCar();
  4. }
  5. // 两个工厂类
  6. class BMWFactory implements CarFactory{
  7. @Override
  8. public BMW getCar() {
  9. return new BMW();
  10. }
  11. }
  12. class BenzFactory implements CarFactory{
  13. @Override
  14. public Benz getCar() {
  15. return new Benz();
  16. }
  17. }
  18. interface Car{
  19. void run();
  20. }
  21. class BMW implements Car{
  22. @Override
  23. public void run() {
  24. System.out.println("宝马在路上跑");
  25. }
  26. }
  27. class Benz implements Car{
  28. @Override
  29. public void run() {
  30. System.out.println("奔驰在路上跑");
  31. }
  32. }

4. 静态代理

静态代理: 需要定义接口或者父类, 被代理对象和代理对象一起实现相同的接口或者继承相同父类优点 : 在不修改目标对象的情况下可对对象中的方法进行增强缺点 : 代理对象和被代理对象都需要实现相同接口或继承相同父类, 因此会产生很多代理类, 且一旦接口增加方法, 目标对象和代理对象均需修改

  1. // 代理类和被代理类都需要实现该接口
  2. interface ITeacherDao{
  3. void teach();
  4. }
  5. // 被代理对象
  6. class TeacherDao implements ITeacherDao{
  7. @Override
  8. public void teach() {
  9. System.out.println("被代理对象在teaching");
  10. }
  11. }
  12. // 代理对象
  13. class TeacherDaoProxy implements ITeacherDao{
  14. // 目标对象(被代理对象)
  15. private ITeacherDao target;
  16. // 构造器
  17. public TeacherDaoProxy(ITeacherDao target) {
  18. this.target = target;
  19. }
  20. @Override
  21. public void teach() {
  22. System.out.println("执行代理对象的teach方法");
  23. target.teach();
  24. System.out.println("代理结束");
  25. }
  26. }

5. JDK动态代理

  1. 动态代理(JDK) : 代理对象不需要实现接口, 被代理对象需要实现接口
  2. CGlib动态代理 : cglib是第三方工具库, 可以创建代理对象. cglib的原理是继承, cglib通过继承目标类, 创建它的子类, 重写父类的方法, 实现功能的修改
  3. 因为cglib是继承, 并重写方法, 因此要求目标类可被继承, 即目标类和目标方法不是final
  4. 由此可见, cglib对目标类的要求比较宽松, 只要能继承即可, 不要求目标类实现某个接口, 因此在框架中大量使用cglib动态代理
  1. public class DynamicProxyTest {
  2. public static void main(String[] args) {
  3. // 1. 创建被代理类
  4. TeacherDao1 teacherDao = new TeacherDao1();
  5. teacherDao.setName("张三");
  6. // 2. 创建代理工程, 传入被代理类
  7. ProxyFactory proxyFactory = new ProxyFactory(teacherDao);
  8. // 3. 从代理工厂中获取代理对象实例, 强转为被代理类
  9. ITeacherDao1 proxyInstance = (ITeacherDao1)proxyFactory.getProxyInstance();
  10. // 4. 通过代理类调用方法
  11. proxyInstance.teach();
  12. }
  13. }
  14. interface ITeacherDao1{
  15. void teach();
  16. }
  17. // 被代理对象
  18. class TeacherDao1 implements ITeacherDao1{
  19. private String name;
  20. public String getName() {
  21. return name;
  22. }
  23. public void setName(String name) {
  24. this.name = name;
  25. }
  26. @Override
  27. public void teach() {
  28. System.out.println("我叫:" + this.name + ", 被代理对象在teaching...");
  29. }
  30. }
  31. class ProxyFactory{
  32. // 维护一个目标对象
  33. private Object target;
  34. // 构造器, 对target进行初始化
  35. public ProxyFactory(Object target) {
  36. this.target = target;
  37. }
  38. public Object getProxyInstance(){
  39. // Proxy.newProxyInstance() 的作用是创建代理对象, 它的的返回值就是目标对象的代理对象
  40. // 参数1:ClassLoader loader : 类加载器, 负责向内存中加载对象, 可以使用反射获取类的类加载器
  41. // 参数2:Class<?>[] interfaces : 目标类实现的接口, 也可以通过反射获取
  42. // 参数3:InvocationHandler h : 这个是有我们编写的, 用于实现代理类需要完成的功能
  43. return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
  44. @Override
  45. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  46. System.out.println("动态代理开始");
  47. Object returnValue = method.invoke(target, args);
  48. System.out.println("动态代理结束");
  49. return returnValue;
  50. }
  51. });
  52. }
  53. }