-
我们为什么要学习设计模式?
-
复用解决方案: 通过复用已经公认的设计,能够在解决问题时取得先发优势.避免重蹈覆辙.您是是否也有类似疑虑:几个项目下好像解决方案大体可以公用.但是就是没有总结.工作好像一直在重复
-
确定通用术语:
开发中的交流和协作都需要共同的词汇其础和对问题的共识.如果交流双方都学习过设计模式交流起来就会十分的舒服.不知道你有没有想表达又表达不清楚的设计
思路,或者自己表达得明白但对方又误解了你的意思了呢?看了设计模式你也许可以找到你想要的答案 -
改善团队的沟通和个人学习.一个团队一起学习设计模式,有助于团队战斗力的提高.
-
代码更易于修改与维护. 因为设计模式都是久经考验的解决方案,它们的结构都是经过长期的发展形成的.善于应对变化.5.学习模式后,就算不用模式中的方法.也会更好的采取更好的策略去解决问题.
-
工厂模式
- 什么是工厂模式?
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
-
使用场景
1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
3、设计一个连接服务器的框架,需要三个协议,“POP3”、“IMAP”、“HTTP”,可以把这三个作为产品类,共同实现一个接口。
-
实现
我们将编写一个工厂模式来完成对不同图形的创建。
-
第一步
创建一个接口(也就是你要把一个什么样类型的东西放进工厂里)
Shape.java
public interface Shape { void draw(); }
-
第二步
创建n个类来实现这个接口(比如你接口是个形状的范说,那么这些类就是具体例子,如圆形、正方形、长方形)
Circle.java
public class Circle implements Shape{ public void draw() { System.out.println("画一个圆"); } }
Women.java(我喜欢女人,所以这里画一个女人)
public class Women implements Shape{ public void draw() { System.out.println("画一个女人"); } }
-
第三步
东西都准备好了,那么该进厂啦!
ShapeFactory.java
public class ShapeFactory { public Shape getShape(String shapeType){ if (shapeType == null){ return null; } if (shapeType.equals("circle")){ return new Circle(); }else if (shapeType.equals("women")){ return new Women(); } return null; } }
这里就是把所有的类的创建交给定义出来的这个工厂,不要去纠结自己要new什么类型的类啦,以后只要来工厂拿就好咯!
-
第四步
测试使用工厂模式
Test.java
public class Test { public static void main(String[] args) { ShapeFactory shapeFactory = new ShapeFactory(); Shape circle = shapeFactory.getShape("circle"); circle.draw(); Shape women = shapeFactory.getShape("women"); women.draw(); } }
由测试类可以看出来,如今若想新建一个对象,不需要去想对象的类型是什么,只要新建一个工厂对象,然后根据工厂内的要求去创建对应的对象啦!
-
单例模式
-
什么是单例模式?
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
-
使用场景
1、要求生产唯一序列号。
2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。
-
实现
饿汉式的实现
-
步骤一
SingleObject.java
public class SingleObject { private static SingleObject instance = new SingleObject(); //这样类就不会被实例化啦 private SingleObject(){} //这样来获取唯一可用的对象 public static SingleObject getInstance(){ return instance; } public void showMessage(){ System.out.println("我是单例模式"); } }
-
步骤二
Test.java
public class Test { public static void main(String[] args) { SingleObject singleObject = SingleObject.getInstance(); singleObject.showMessage(); } }
懒汉式的实现
-
步骤一
public class SingleObject { private static SingleObject instance; //这样类就不会被实例化啦 private SingleObject(){} //这样来获取唯一可用的对象 public static SingleObject getInstance(){ if(instance == null){ instance = new SingleObject(); } return instance; } public void showMessage(){ System.out.println("我是单例模式"); } }
-
步骤二
同饿汉式一样啦!
下面对单件模式的懒汉式与饿汉式进行简单介绍:
1、饿汉式:在程序启动或单件模式类被加载的时候,单件模式实例就已经被创建。
2、懒汉式:当程序第一次访问单件模式实例时才进行创建。
如何选择:如果单件模式实例在系统中经常会被用到,饿汉式是一个不错的选择。
反之如果单件模式在系统中会很少用到或者几乎不会用到,那么懒汉式是一个不错的选择。
-