工厂模式
代码如下:
产品类:
//抽象产品
abstract class BMW {
public BMW(){
}
}
//具体产品
public class BMW320 extends BMW {
public BMW320() {
System.out.println(“制造–>BMW320”);
}
}
//具体产品
public class BMW523 extends BMW{
public BMW523(){
System.out.println(“制造–>BMW523”);
}
}
创建工厂类:
//现在的工厂是一个接口
interface FactoryBMW {
BMW createBMW();
}
//具体的工厂
public class FactoryBMW320 implements FactoryBMW{
@Override
public BMW320 createBMW() {
return new BMW320();
}
}
public class FactoryBMW523 implements FactoryBMW {
@Override
public BMW523 createBMW() {
return new BMW523();
}
}
客户类:
public class Customer {
public static void main(String[] args) {
FactoryBMW320 factoryBMW320 = new FactoryBMW320();
BMW320 bmw320 = factoryBMW320.createBMW();
FactoryBMW523 factoryBMW523 = new FactoryBMW523();
BMW523 bmw523 = factoryBMW523.createBMW();
}
}
总结:
这种工厂方法,如果后期还有新的具体产品,只需要继承BMW这个类(抽象产品),然后定义新的工厂,
同样是实现FactoryBMW这个接口(工厂接口),生产具体的产品就ok了。这样就符合开闭原则,对扩展开发,修改关闭。
而简单工厂方法:如果后期有新的产品,产品同样可以继承BMW这个类(抽象产品),
但是,如果要得到这个具体的产品时,需要在原来工厂类中修改代码,添加一个新产品的方法,
这样就修改了原来的代码,这就不符合开闭原则了。
三种单例模式
懒汉式单例
package com.zl.server.sington;
public class Singletonl {
/**
* 懒汉式单例类,在第一次调用的时候实例化
*/
public Singletonl() {
// 注意这里没有final
}
private static Singletonl single;
// 只实例化一次
static {
single = new Singletonl();
}
public synchronized static Singletonl getInstance() {
if (single == null) {
single = new Singletonl();
}
return single;
}
}
饿汉式单例
package com.zl.server.sington;
/**
- 饿汉式单例
- @author liumeng
*/
public class Singletone {
//私有的默认结构子
private Singletone() {
}//已经自行实例化
private static final Singletone single = new Singletone();//静态工厂方法
public static Singletone getInstance() {
return single;
}
}
双检锁/双重校验锁
package com.zl.server.sington;
/**
- 双检锁/双重校验锁(DCL,即 double-checked locking(jdk1.5)
*/
public class Singleton {
private volatile static Singleton singleton;
private Singleton() {
}
public static Singleton getSingleton() {
if(singleton == null) {
synchronized (Singleton.class) {
if(singleton == null) {
singleton =new Singleton();
}
}
}
return singleton;
}
}