@boothsun
2018-04-26T01:42:53.000000Z
字数 3042
阅读 1439
面试题
双重检查锁:
public class SingletonDemo7 {private volatile static SingletonDemo7 singletonDemo7;private SingletonDemo7(){}public static SingletonDemo7 getSingletonDemo7(){if (singletonDemo7 == null) {synchronized (SingletonDemo7.class) {if (singletonDemo7 == null) {singletonDemo7 = new SingletonDemo7();}}}return singletonDemo7;}}
静态类成员变量
public class SingletonDemo3 {private static SingletonDemo3 instance = new SingletonDemo3();private SingletonDemo3(){}public static SingletonDemo3 getInstance(){return instance;}}
静态内部类
public class SingletonDemo5 {private static class SingletonHolder{private static final SingletonDemo5 instance = new SingletonDemo5();}private SingletonDemo5(){}public static final SingletonDemo5 getInsatance(){return SingletonHolder.instance;}}
定义:
简单工厂模式:定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简单工厂模式又被称为静态工厂方法模式。
角色:
代码
class Factory {//静态工厂方法public static Product getProduct(String arg) {Product product = null;if (arg.equalsIgnoreCase("A")) {product = new ConcreteProductA();//初始化设置product}else if (arg.equalsIgnoreCase("B")) {product = new ConcreteProductB();//初始化设置product}return product;}}class Client {public static void main(String args[]) {LoggerFactory factory;Logger logger;factory = new FileLoggerFactory(); //可引入配置文件实现logger = factory.createLogger();logger.writeLog();}}
简单工厂模式的缺点:当系统中需要引入新的产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背“开闭原则”。
在工厂方法模式中,我们不再提供一个统一的工厂类来创建所有的产品对象,而是针对不同的产品提供不同的工厂,系统提供一个与产品等级结构对应的工厂等级结构。
定义:
工厂方法模式:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。
角色:
角色:
//日志记录器接口:抽象产品interface Logger {public void writeLog();}//数据库日志记录器:具体产品class DatabaseLogger implements Logger {public void writeLog() {System.out.println("数据库日志记录。");}}//文件日志记录器:具体产品class FileLogger implements Logger {public void writeLog() {System.out.println("文件日志记录。");}}//日志记录器工厂接口:抽象工厂interface LoggerFactory {public Logger createLogger();}//数据库日志记录器工厂类:具体工厂class DatabaseLoggerFactory implements LoggerFactory {public Logger createLogger() {//连接数据库,代码省略//创建数据库日志记录器对象Logger logger = new DatabaseLogger();//初始化数据库日志记录器,代码省略return logger;}}//文件日志记录器工厂类:具体工厂class FileLoggerFactory implements LoggerFactory {public Logger createLogger() {//创建文件日志记录器对象Logger logger = new FileLogger();//创建文件,代码省略return logger;}}// 客户端 使用class Client {public static void main(String args[]) {LoggerFactory factory;Logger logger;factory = new FileLoggerFactory(); //可引入配置文件实现logger = factory.createLogger();logger.writeLog();}}
工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统复杂度。此时,我们就可以考虑由同一个工厂来统一生产多个产品。
定义:
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。
角色: