本人JAVA渣渣,从Python半路出家转到JAVA的坑,一直想系统学习整理下JAVA设计模式。设计模式大多是经验之谈,关键是理解思想。
工厂模式
工厂模式(Factory Pattern)是Java 中最常用的设计模式之一。 这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
-
原始模式
Interface:Milk
Class: Telunsu 继承Milk接口
使用: new Telunsu().getName(); -
简单工厂模式(com.ld.pattern.factory.simplefactory):对于用户而言,隐藏创建对象的过程
//SimpleFactory.java if("Telunsu".equals(name)) return new Telunsu(); ... //SimpleFactoryTest.java SimpleFactory f = new SimpleFactory(); f.getMilk("Telunsu");
-
工厂方法模式(com.ld.pattern.factory.factoryfunc):把工厂也抽象成接口, 具体的工厂类实现特定的功能
Interface:Factory
class: TelunsuFactorypublic class TelunsuFactory implements Factory { public Milk getMilk() { return new Telunsu(); } }
-
抽象工厂模式(com.ld.pattern.factory.abstractfunc):用户的主入口是一个抽象类用来提供入口。用户通过访问这个抽象工厂就可以一目了然该工厂能提供什么样的产品服务。使用抽象类既可以写接口的功能还可以存储业务逻辑。相比较于工厂方法模式的好处是易于扩展:比如增加sanlu牛:简单工厂则需改动原始判断代码违背开闭原则,工厂方法模式增加新的工厂,而在抽象工厂模式中,用户只需要新增接口。
public abstract class AbstractFactory { public abstract Milk getMengniu(); public abstract Milk getYili(); public abstract Milk getTelunsu(); }
具体的工厂实现类:
public class MengniuFactory implements Factory { public Milk getMilk() { return new Mengniu(); } }
测试:
public static void main(String[] args) { MilkFactory MF = new MilkFactory(); System.out.println(MF.getMengniu()); }
单例模式
单例也是常用的软件设计模式,属于创建型模式的一种。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象有利于协调系统整体的行为。
- 饿汉式:在实例使用之前,不管是否使用都先new出来再说。避免了线程安全问题。
类的构造函数定义为private的,保证其他类不能实例化此类.
然后提供了一个静态实例并返回给调用者.
测试:
- 懒汉式:默认加载的时候不实例化,需要用到再实例化。(在Spring里延时加载就是使用的这个)
解决1:增加同步锁(synchronized),但是这样做性能极差非常耗时。
解决2: 使用比较tricky的线程内部类。
- 注册登记式:
每使用一次,都往一个固定容器注册并将使用过的缓存。IOC中的单例都是典型的注册登记单例。