设计模式之单例模式、策略模式

设计模式

设计模式是解决某一类问题通用的解决方案
可以让代码跟容易被理解,确保了复用性、可靠性、可拓展性

分为三类:

1.创建型模式(5种):

单例模式
工厂方法模式
抽象工厂模式
建造者模式
原型模式

2.结构型模式(7种):

适配器模式
装饰者模式
代理模式
外观模式
桥接模式
组合模式
享元模式

3.行为型模式(11种):

观察者模式
策略模式
模板模式
责任链模式
解析器模式
迭代子模式
命令模式
状态模式
备忘录模式
访问者模式
中介者模式

单例模式(Singleton)

设计:一个类只能创建一个对象,有效减少内存占用空间
实现:

  • 私有的构造方法
  • 私有的静态的当前类对象作为属性(静态的:让属性只加载一次)
  • 公有的静态方法返回当前类对象(静态的:外部通过类名调用方法)

一、饿汉式单例(立即加载)

  • 优点:不会产生没有对象就拿来使用的问题,避免空指针异常
  • 缺点:启动项目加载对象过多,有些对象没有使用,产生服务器承载压力问题

SingleTon.java

package singleton;

public class SingleTon {
    //通过设计,让这个类只创建一个对象

    //每一个类都有一个无参的构造方法----公有的,可以随意创建
    //1.让构造方法变成私有的------------私有的,不可随意创建
    private SingleTon(){}
    //2.单例------在本类中的一个成员中创建一个对象
    //属性
    //方法-------不行,每一次执行都会产生一个过程,StackOverFlowError
    //构造方法---不行,私有的,本身就是构建过程
    //程序块-----不行,没有返回值,无法给别人使用
    //创建一个当前类类型的私有的静态的属性,私有:保护属性安全;静态:属性对象只有一份
    private static SingleTon singleton = new SingleTon();
    //3.提供一个获取单个对象的方法给用户
    //返回值:将对象返回出去
    public static SingleTon getSingleton(){
        return singleton;
    }
}

TestMain.java

package singleton;

public class TestMain {
    public static void main(String[] args){
        SingleTon s1 = SingleTon.getSingleton();
        SingleTon s2 = SingleTon.getSingleton();
        System.out.println(s1==s2);
        System.out.println(s1.equals(s2));
        System.out.println(s1);//类全名@hashCode-->16进制整数
        System.out.println(s2);
    }
}

二、懒汉式单例(延迟加载)

  • 优点:启动项目时只有需要才加载,不需要不会创建,不浪费空间
  • 缺点:可能由于操作不当导致异常(严谨)

SingleTon.java

package singleton;

public class SingleTon {
    private SingleTon(){}
    private static SingleTon singleton = null;
    public static SingleTon getSingleton(){
        if(singleton == null){
            singleton = new SingleTon();
        }
        return singleton;
    }
}

策略模式

设计:一个抽象方法,对抽象方法的每一个具体的实现都是一个小策略

用来解决执行的流程是固定的,执行的结果由于提供的策略不同而不同

为银行类传入一个抽象方法,由子类进行实现

银行类-----控制流程
人类--------提供抽象策略
具体类(长者、年轻人、土豪)-------实现策略

Bank.java

package bank;

public class Bank {

    //1.开门,等待用户办理
    public void profession(Person person){
        System.out.println(person.getName() + "进入银行了");
        person.callNumber();
        person.transact();
        person.leave();
    }

}

Person.java

package bank;

public abstract class Person {
    protected String name;

    public String getName(){
        return this.name;
    }
    //1.进银行叫一个号码,排队
    public abstract void callNumber();
    //2.去窗口办理
    public abstract void transact();
    //3.办理完毕,离开
    public abstract void leave();
}

OldMan.java

package bank;

public class OldMan extends Person {
    public OldMan(){}
    public OldMan(String name){
        this.name = name;
    }
    //1.进银行叫一个号码,排队
    public void callNumber(){
        System.out.println("年事已高,不知道在哪取号,找大堂经理寻求帮助");
    }
    //2.去窗口办理
    public void transact(){
        System.out.println("到窗口拿出手绢,掏出存折,取钱");
    }
    //3.办理完毕,离开
    public void leave(){
        System.out.println("取完钱离开银行");
    }
}

YoungMan.java

package bank;

public class YoungMan extends Person{
    public YoungMan(){}
    public YoungMan(String name){
        this.name = name;
    }

    //1.进银行叫一个号码,排队
    public void callNumber(){
        System.out.println("门口取号机取号,拿到小票");
    }
    //2.去窗口办理
    public void transact(){
        System.out.println("去窗口办理业务");
    }
    //3.办理完毕,离开
    public void leave(){
        System.out.println("办理完毕,迅速离开");
    }
}

Toff.java

package bank;

public class Toff extends Person{
    public Toff(){}
    public Toff(String name){
        this.name = name;
    }

    //1.进银行叫一个号码,排队
    public void callNumber(){
        System.out.println("我是土豪,不需要排号,直接进入VIP窗口");
    }
    //2.去窗口办理
    public void transact(){
        System.out.println("出示黑卡");
    }
    //3.办理完毕,离开
    public void leave(){
        System.out.println("潇洒离开");
    }
}

Test.java

package bank;

public class Test {
    public static void main(String[] args){
        Bank bank = new Bank();
        Person om = new OldMan("长者");
        bank.profession(om);

        Person ym = new YoungMan("年轻人");
        bank.profession(ym);

        Person t = new Toff("土豪");
        bank.profession(t);
    }
}

你可能感兴趣的:(java,设计模式,java,编程语言)