设计模式是解决某一类问题通用的解决方案
可以让代码跟容易被理解,确保了复用性、可靠性、可拓展性
1.创建型模式(5种):
单例模式 |
---|
工厂方法模式 |
抽象工厂模式 |
建造者模式 |
原型模式 |
2.结构型模式(7种):
适配器模式 |
---|
装饰者模式 |
代理模式 |
外观模式 |
桥接模式 |
组合模式 |
享元模式 |
3.行为型模式(11种):
观察者模式 |
---|
策略模式 |
模板模式 |
责任链模式 |
解析器模式 |
迭代子模式 |
命令模式 |
状态模式 |
备忘录模式 |
访问者模式 |
中介者模式 |
设计:一个类只能创建一个对象,有效减少内存占用空间
实现:
一、饿汉式单例(立即加载)
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);
}
}