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