• 常用设计模式


    Singleton(单例模式)

    一句话总结:一个类在Java虚拟机中只有一个对象,并提供一个全局访问点。

    生活中例子:太阳、月亮、国家主席等。

    解决什么问题:对象的唯一性,性能浪费太多。

    项目里面怎么用:数据库连接对象,属性配置文件的读取对象。

    模式结构:分为饿汉式和懒汉式(如果考虑性能问题的话,就使用懒汉式,因为懒汉式是在方法里面进行初始化的),构造器私  有化,对外提供方法加同步关键字。

    框架里面使用:Struts1的Action。

    JDK里面使用:java.lang.Runtime#getRuntimejava.awt.Desktop#getDesktop。

    饿汉式代码:

    1 public class HurgrySingleton {
    2 private static HurgrySingleton hurgry=new HurgrySingleton();
    3 private HurgrySingleton(){};
    4      public static HurgrySingleton getSinletonHurgry(){
    5          return hurgry;
    6         }
    7 }

    懒汉式代码:

     1 public class LarzySingleton {
     2    private static LarzySingleton larzy=null;
     3    private LarzySingleton(){};
     4    public static synchronized Larzy getSinletonLarzy(){
     5         if(larzy==null){
     6               larzy=new LarzySingleton();
     7         }
     8         return larzy;
     9     }
    10 }

    Factory(简单的工厂模式)

    一句话总结:用一个方法来代替new关键字

    生活中的例子:制衣厂、面包厂等生产厂。

    解决什么问题:对象产生过多,或者经常有子类替换生成。

    项目里面怎么用:对于经常生成的对象,或者父子类替换的对象。

    模式结构:写一个对外声明的方法,方法里面使用new关键字代替。

    框架里面使用:spring的核心就是工厂模式。

    JDK里面使用:newInstance。

    工厂模式代码:

    1 public class UserFactory {
    2      public static User createUser(int i){
    3 //如果输入的是1,就创建它的子类,否则就创建父类
    4          if(i==1){
    5              return new Alices();
    6           }
    7          return new User();
    8      }
    9 }

    Proxy(代理模式)

    一句话总结:为其他对象提供一个代理,以控制对当前对象的访问。

    生活中的例子:房屋中介、婚姻介绍所。

    解决什么问题:不能直接访问该对象,或者太大的资源耗费多。

    项目里面怎么用:权限,或者大对象的访问权限。

    模式结构:代理类和被代理类实现同一个接口,用户访问的时候先访问代理对象,然后让代理对象去访问被代理对象。

    框架里面使用:Spring里面的AOP实现。

    JDK里面使用:java.lang.reflect.Proxy。

    代理模式代码:

    创建一个接口:

    1 public interface SellHouse {
    2     void sell(double money);
    3 }

    创建一个被代理类:

    1 public class Hoster implements SellHouse {
    2         @Override
    3         public void sell(double money) {
    4             System.out.println("祝你居住愉快");
    5         }
    6     }

    创建一个代理类:

     1 public class Medium implements SellHouse {
     2     SellHouse hoster=new Hoster();
     3     @Override
     4     public void sell(double money) {
     5         if(money>=1000){
     6             hoster.sell(money);
     7         }else{
     8             System.out.println("你的价格太低了");
     9         }
    10     }
    11 }

    测试类:

    1 public class Renter {
    2     public static void main(String[] args) {
    3         SellHouse renter=new Medium();
    4         renter.sell(500);
    5     }
    6 }

    Adapter(适配器模式)

    一句话总结:将两个原来不兼容的类兼容起来一起工作。

    生活中的例子:变压器、充电器

    解决什么问题:已经存在的相同功能的代码,但是接口不兼容,不能直接调用。

    项目里面怎么用:在使用旧的API的时候,没有源码,和新的不能兼容。

    模式结构:分为类适配器和对象适配,一般常用的就是对象适配器,因为组合由于继承。

    框架里面使用:单元测试里面的asserEquels。

    JDK里面使用:java.util.Arrays#asListjava.io.InputStreamReader(InputStream) java.io.outputStreamWriter(OutputStream)。

    Strategy(策略模式)

    一句话总结:定义一系列算法并可以互相替换。

    生活中的例子:图片的格式,压缩文件的格式。

    解决什么问题:做一件事情有很多种方法。

    项目里面怎么用:购物车里面的付款方式。

    模式结构:声明一个顶级接口,定义一个策略方法,具体的实例都要实现这个接口。

    框架里面使用:hibernate的主键生成策略。

    JDK里面使用:java.util.Comparator#compare。

    策略模式代码:

    定义一个顶级接口:

    1 public interface Person {
    2     void repast();
    3 }

    具体的实例类1:

    1 public class African implements Person {
    2     @Override
    3     public void repast() {
    4         System.out.println("非洲人用手吃饭");
    5     }
    6 }

    具体的实例类2:

    1 public class America implements Person {
    2     @Override
    3     public void repast() {
    4         System.out.println("美国人用刀叉吃饭");
    5     }
    6 }

    具体的实例类3:

    1 public class Chinese implements Person {
    2     @Override
    3     public void repast() {
    4         System.out.println("中国人用筷子吃饭");
    5     }
    6 }

    测试类:

     1 public class Test {
     2     public static void main(String[] args) {
     3         Person chinese=new Chinese();
     4         Person america=new America();
     5         Person african=new African();
     6         chinese.repast();
     7         america.repast();
     8         african.repast();
     9     }
    10 }

    Template(模板模式)

    一句话总结:父类定义流程,子类实现流程。

    生活中的例子:iphone生产有多个国家,但流程只有一个。

    解决什么问题:业务有多种,但都有规定的流程。

    项目里面怎么用:一般基类的实现都是模板模式,BaseDAO,bBaseService。

    模式结构:定义一个抽象父类定义流程,或者常用方法和常量,子类继承父类,实现具体的细节方法。

    框架里面使用:hibernate里面的方言,是跨数据库的基础。

    JDK里面使用:IO流里面的InputStream,Writer等。

    模板模式代码:

    //定义一个父类,定义流程

     1 public abstract class IPhoneTemplate {
     2     public void createIPhone(){
     3         setupCpu();
     4         setupAll();
     5         check();
     6         box();
     7     }
     8     protected abstract void box();
     9     protected abstract boolean check(); 
    10     protected abstract void setupAll();
    11     protected abstract void setupCpu(); 
    12 }

    //子类实现父类的细节方法1

     1 public class ChinaIPhone extends IPhoneTemplate {
     2     @Override
     3     protected void box() {
     4         System.out.println("box()");
     5     }
     6     @Override
     7     protected boolean check() {
     8         System.out.println("check()");
     9         return true;
    10     }
    11     @Override
    12     protected void setupAll() {
    13         System.out.println("setupAll()");
    14     }
    15     @Override
    16     protected void setupCpu() {
    17         System.out.println("setupCpu()");
    18     }
    19 }

    //子类实现父类的细节方法2

     1 public class AfricanIPhone extends IPhoneTemplate {
     2     @Override
     3     protected void box() {
     4         System.out.println("box()");
     5     }
     6     @Override
     7     protected boolean check() {
     8         System.out.println("check()");
     9         return true;
    10     }
    11     @Override
    12     protected void setupAll() {
    13         System.out.println("setupAll()");
    14     }
    15     @Override
    16     protected void setupCpu() {
    17         System.out.println("setupCpu()");
    18     }
    19 }
    20  
    21  
  • 相关阅读:
    shell lab
    cache lab
    后缀树
    leetcode maximum-length-of-repeated-subarray/submissions
    leetcode assign-cookies
    lcs
    leetcode delete-operation-for-two-strings
    【C】C语言typedef
    【C】C语言结构体指针的语法
    【JAVA】Java 命令行参数解析
  • 原文地址:https://www.cnblogs.com/luxd/p/9773325.html
Copyright © 2020-2023  润新知