public class GOF23 { // 饿汉式 private static final List list = new ArrayList();
public static List getInstance() { return list; } }
2.懒汉式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
// 懒汉式 // 使用双检锁,并且由于 jvm 指令重排序我们需要使用 volatile 关键字抑制指令重排序 public class GOF{ private static volatile List list1; public static List getInstanceLazy() { synchronized (Object.class) { if (list1 == null) { synchronized (Object.class){ list1 = new ArrayList(); return list; } }else { return list; } } } }
3.静态内部类
1 2 3 4 5 6 7 8 9 10
public class GOF{ // 静态内部类 public static class SingletonClass{ private static final List list2 = new ArrayList(); } // 首先要去加载这个静态内部类,然后这个时候会调用 cinit 方法这个是天然的线程安全的,然后返回这个对象即可 可以延时加载 public List getStaticInstance(){ return SingletonClass.list2; } }
4.枚举
1 2 3 4 5 6
public class GOF23 { // 采用枚举的方式 不能延时加载 由 jvm 底层完成的 public enum SingleInstanceEnum{ INSTANCE_ENUM } }
public class Audi implements Car { @Override public void run() { System.out.println("audi run"); } }
public class Daben implements Car { @Override public void run() { System.out.println("daben run"); } }
public class CarFactory { public static Car createCar(String type) { if (type.equals("daben")) { return new Daben(); } else if (type.equals("audi")) { return new Audi(); }else { return null; } } }
public class CarClient { public static void main(String[] args) { Daben daben = (Daben) CarFactory.createCar("daben"); daben.run(); } }
// 座椅类型 public interface Seat { public void desc(); }
class LuxurySeat implements Seat {
@Override public void desc() { System.out.println("high quality seat"); } }
class LowSeat implements Seat {
@Override public void desc() { System.out.println("low seat"); } }
// 引擎类型 public interface Engine { public void run(); }
class LuxuryEngine implements Engine {
@Override public void run() { System.out.println("high speed engine"); } }
class LowEngine implements Engine {
@Override public void run() { System.out.println("low engine"); } }
// 车的抽象工厂 public interface AbstractCarFactory { public Seat createSeat(); public Engine creaateEngine(); }
// 两个工厂的实现,分别是高级车工厂,低级车工厂 public class LuxuryCarFactory implements AbstractCarFactory { @Override public Seat createSeat() { return new LuxurySeat(); }
@Override public Engine creaateEngine() { return new LuxuryEngine(); } }
public class LowCarFactory implements AbstractCarFactory{ @Override public Seat createSeat() { return new LowSeat(); }
@Override public Engine creaateEngine() { return new LowEngine(); } }
@AllArgsConstructor public class SimpleHandler implements InvocationHandler { RealObject real; public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("heihei"); return (Object) method.invoke(real, args); } }
被代理对象
1 2 3 4 5 6 7 8 9
public interface ObjectInterface { public void hello(); }
public class RealObject implements ObjectInterface { public void hello(){ System.out.println("hello"); } }
生成代理对象的过程
1 2 3 4 5 6 7 8
public class JdkClient { public static void main(String[] args) { RealObject realObject = new RealObject(); SimpleHandler simpleHandler = new SimpleHandler(realObject); ObjectInterface proxyInstance = (ObjectInterface) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{ObjectInterface.class}, simpleHandler); proxyInstance.hello(); } }
七、桥接模式
桥接模式就是为了处理两个维度的事情,比如说我们定义一个电脑类,那么我们如果需要售卖笔记本、平板、台式机而这些东西又有不同的品牌那么我们就需要建立很多的类在电脑这个类下面。但是我们采用桥接的话我们抽出一个接口这个接口代表了品牌,然后有一个抽象类(电脑类型)包含了品牌的引用,我们只需要在不同的电脑类型下面建立各个类型,在创建一个品牌类型的电脑的时候直接 new 出来就行了。