1. 什么是设计模式
2. 学习设计模式的意义
今天分享面试常问的单例模式和工厂模式
一、单例模式
意图:保证一个类仅有一个实例,并提供一个访问他的全局访问点。
主要解决:一个全局使用的类频繁的创建与销毁。
何时使用:当您想控制实例数目节省系统资源的时候。
如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
关键代码:构造函数是私有的。
1. 饿汉式单例
java //饿汉式单例 public class Hungry{ //可能会浪费空间 private byte[] data1=new byte[1024*1024]; private byte[] data2=new byte[1024*1024]; private byte[] data3=new byte[1024*1024]; private byte[] data4=new byte[1024*1024]; private Hungry(){ } private final static Hungry HUNGRY = new Hungry(); public static Hungry getInstance(){ return HUNGRY; } }
饿汉式单例由于new一个对象时不是一个原子性操作,即 new一个对象时, java内部会进行更细致的线程操作,则导致在多线程的条件下会不安全
2. 懒汉式单例
java //懒汉式单例 public class LazyMan{ private LazyMan(){ } private volatile static LazyMan lazyMan; //双重检测模式的懒汉式单例 ,即DCL懒汉式 public static LazyMan getInstance(){ if(lazyMan==null){ synchronized(LazyMan.class){ if(lazyMan==null){ lazyMan=new LazyMan(); //不是一个原子性操作 /** 1.分配内存空间 2.执行构造方法,初始化对象 3.把这个对象指向这个空间 123 A 132 B 此时lazyMan还没有完成构造 **/ } } } return lazyMan; } //多线程下不安全 //多线程并发 public static void main(String[] args){ for(int i = 0; i < 10; i++){ new Thread(()->{ lazyMan.getInstance(); }).start(); } }}
3. 内部类实现单例
java //静态内部类实现public class Holder{ public static class InnerClass{ } public static Holder getInstance(){ return InnerClass.HOLDER; } public static class InnerClass{ private static final Holder HOLDER=new Holder(); }}
二、工厂模式
1. 简单工厂模式(静态工厂)
某种程度上不符合设计原则,但实际使用最多。
原始方法
java public interface Car { public void name(); } public class Tesla implements Car{ public void name(){ System.out.println(“特斯拉!”); }} public class WuLing implements Car{ public void name(){ System.out.println(“五菱宏光!”); }} public class Consumer { public static void main(String[] args) { // 接口,所有实现类 Car car=new WuLing(); Car car2=new Tesla(); car.name(); car2.name(); // Car car = CarFactory.getCar(“五菱”); // car.name(); }}
运行截图
这种方法需要知道所有接口和实现类才能调用
静态工厂方法
因为CarFactory类中的所有方法都是静态的,需要向其中添加参数来返回不同的对象实例。
增加一个新的产品,如果不修改CarFactory代码就做不到。
java public class CarFactory { // 方法一 public static Car getCar(String car){ if(car.equals(“五菱”)){ return new WuLing(); }else if(car.equals(“特斯拉”)){ return new Tesla(); }else { return null; } } // 方法二 public static Car getWuLing(){ return new WuLing(); } public static Car getTesla(){ return new Tesla(); }} public class Consumer { public static void main(String[] args) { // 接口,所有实现类 // Car car=new WuLing(); // Car car2=new Tesla(); // car.name(); // car2.name(); Car car = CarFactory.getCar(“五菱”); Car car2 = CarFactory.getCar(“特斯拉”); car.name(); car2.name(); }}
运行截图
图形描述:
代码分析:
2. 工厂方法模式
不修改已有类的前提下,可以增加产品类。
java public interface CarFactory { Car getCar(); } public class TeslaFactory implements CarFactory { public Car getCar() { return new Tesla(); }} public class WuLingFactory implements CarFactory { @Override public Car getCar() { return new WuLing(); }} public class Consumer { public static void main(String[] args) { Car car = new WuLingFactory().getCar(); Car car1 = new TeslaFactory().getCar(); car.name(); car1.name(); }}
运行截图:
新增一个产品
java public class DaZhong implements Car{ @Override public void name() { System.out.println(“大众!”); }} public class DaZhongFactory implements CarFactory { @Override public Car getCar() { return new DaZhong(); }} public class Consumer { public static void main(String[] args) { Car car = new WuLingFactory().getCar(); Car car1 = new TeslaFactory().getCar(); car.name(); car1.name(); Car car2 = new DaZhongFactory().getCar(); car2.name(); }}
运行截图:
图形描述:
对比
根据设计原则:工厂方法模式
根据实际业务:简单工厂模式
3、抽象工厂模式
今天的介绍就到这里,如果需要课程资源可以移步我们官 看看,上面有很多免费在线课程资源,各个方向的都有哦。「链接」
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!