1、设计模式遵守原则
a、开闭原则(Open Close Principle)
对扩展开放,对修改关闭。
2、里氏代换原则(Liskov Substitution Principle)
只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。
3、依赖倒转原则(Dependence Inversion Principle)
这个是开闭原则的基础,对接口编程,依赖于抽象而不依赖于具体。
4、接口隔离原则(Interface Segregation Principle)
使用多个隔离的接口来降低耦合度。
5、迪米特法则(最少知道原则)(Demeter Principle)
一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
6、合成复用原则(Composite Reuse Principle)
原则是尽量使用合成/聚合的方式,而不是使用继承。继承实际上破坏了类的封装性,超类的方法可能会被子类修改。
2、顾名思义,单例是指工程中只出现一次实例。单例模式的最大作用是,限制程序中出现过多冗余的实例,常见的应用场景有工程配置文件加载、多线程数据库连接池、操作系统的文件系统等;
3、单线程时单例模式设计:
经典的a、恶汉模式b、饱汉模式
a、恶汉模式【静态常量】,工程加载时虚拟机会自动实例化实例。无需担心线程安全问题,但是无法判断是否用到对应实例,任然存 在资源让费风险。
class SingletonInstance{
private SingletonInstance(){};
private static SingletonInstance singletonInstance = new SingletonInstance();
public SingletonInstance getInstance(){
return sinletonInstance;
}
}
b、懒汉模式,调用的时候创建对应的实例,实现单例模式,但是在多线程时存在线程安全问题。
class SingletonInstance{
private SingletonInstance(){};
private static SingletonInstance singletonInstance = null;
public static SingletonInstance getInstance(){
if(singletonInstance == null){
singletonInstance = new SingletonInstance();
}
return singletonInstance;
}
}
4、多线程情况下,设计单例模式:
a、懒汉模式,进行加锁操作(并没有实现同步)
public class SingletonInstance {
private SingletonInstance(){};
private static SingletonInstance singletonInstace = null;
public static SingletonInstance getInstance(){
synchronized(SingletonInstance.class){
if(singletonInstace ==null){
singletonInstace = new SingletonInstance();
}
}
return singletonInstace;
}
}
b、懒汉模式,同步代码块(效率比较低)
class SingletonInstance{
private SingletonInstance(){};
private static SingletonInstance singletonInstance = null;
public static synchronized SingletonInstance getInstance(){
if(singletonInstance == null){
singletonInstance = new SingletonInstance();
}
return singletonInstance;
}
}
c、懒汉模式,双重加锁实现多线程同步,采用volatile关键字。
class SingletonInstance{
private SingletonInstance(){};
private static volatile SingletonInstance singletonInstance = null;
public static SingletonInstance getInstance(){
if(singletonInstance == null){
synchronized (SingletonInstance.class){
if(singletonInstance == null){
singletonInstance = new SingletonInstance();
}
}
}
return singletonInstance;
}
}
d、静态内部类,实现单例模式。
class SingletonInstance{
private SingletonInstance(){};
private static class Instance{
private static final SingletonInstance SI = new SingletonInstance();
}
public SingletonInstance getSingletonInstance(){
return Instance.SI;
}
}
e、通过枚举类实现单例模式【其实和静态内部类实现单例模式类似】【建议采用】。
class SingletonInstance{....};
public enum GetSingletonInstance{
INSTANCE;
private SingletonInstance singletonInstance = null;
private GetSingletonInstance{
singletonInstance = new SingletonInstance();
}
public SingletonInstance getSingletonInstance(){
return singletonInstance;
}
}
调用的时候采用 GetSingletonInstance.INSTANCE.getSingletonInstance()获取SingletonInstance类的单例。
5、注释
a、java中volatile关键字。
首先,了解共享变量的概念。
i=i+1;
这条程序的执行过程,由一条线程向主内存复制一份i变量值到计算机高速缓存中,cpu指令执行,写入计算机高速缓存,最后将计算机高速缓存值刷新会计算机主内存。
当多核cpu对这条代码操作多次时,每条线程都有自己的高速缓存区,因此会出现缓存不一致性问题。
也就是说,如果一个变量在多个CPU中都存在缓存(一般在多线程编程时才会出现),那么就可能存在缓存不 一致的问题。解决方案,总线加锁、缓存一致性协议【硬件层面】。
并发编程中必须保证的三个原则,原子性、可见性、有序性。java中通过synchronized【锁】来实现多线程情况下的原子性。通过volatile关键字保证共享变量的可见性,同时也可以通过锁机制实现变量的可见性,当进程执行出锁时会将高速缓存中变量值刷会主内存。java中的有序性可以通过synchronized和volatile关键字实现,java语言的happens-before机制也保证了程序执行的有序性【现行发生原则】。现行发生原则包括,程序次序规则、锁定规则、volatile变量规则、传递规 则、线程启动规则、线程中断规则、线程终止规则、对象销 毁规则。
b、java 中枚举类实现方式【jdk1.5以上】
enum Instance{
INSTANCETYPE1,INSTANCETYPE2,INSTANCETYPE3;
}
类似于
Instance extends enum{
private static final INSTANCETYPE1; //相当于—— new Instance()
private static final INSTANCETYPE2; //相当于—— new Instance()
private static final INSTANCETYPE3; //相当于—— new Instance()
}
这里INSTANCETYPE1、INSTANCETYPE2、INSTANCETYPE3都是类Instance的实例,由于枚举类规定其构造方法必须为私有的,因此实例化过程由其自身实现。
可以在枚举类中定义私有构造函数,普通方法,抽象方法。
enum Instance {
InstanceType1(1,"Type1"){
public String normalMethod(String Type){
return "Type1重写的普通方法"+Type;
}
@Override
public String abstractMethod(String Type) {
// TODO Auto-generated method stub
return InstanceType1.propertity1+InstanceType1.propertity2+"Type1重写的抽象方法"+Type;
}
},
InstanceType2(2,"Type2"){
@Override
public String abstractMethod(String Type) {
// TODO Auto-generated method stub
return InstanceType2.propertity1+InstanceType2.propertity2+"Type2重写的抽象方法"+Type;
}
};
private Integer propertity1;
private String propertity2;
Instance(Integer propertity1,String propertity2){
this.propertity1 = propertity1;
this.propertity2 = propertity2;
}
public String normalMethod(String Type){
return Type+"这是普通方法";
}
public abstract String abstractMethod(String Type);
}
6、实例【读取配置文件】
import java.io.InputStream;
import java.util.Properties;
enum TestForSingletonInstance {
INSTANCE;
private PorpertityLoad porpertityLoad=null;
TestForSingletonInstance(){
if(porpertityLoad == null)
porpertityLoad = new PorpertityLoad();
}
public PorpertityLoad getSinletonInstance(){
return porpertityLoad;
}
}
class PorpertityLoad{
public Properties properties = null;
PorpertityLoad (){
try {
properties = new Properties();
InputStream in = TestForSingletonInstance. class.getClassLoader().
getResourceAsStream("properties/singletonInstanceTest.properties");
properties.load(in);
} catch (Exception e) {
// TODO: handle exception
}
}
}