您的位置:首页 > 其它

设计模式之单例模式&工厂模式

2018-02-03 10:55 519 查看

单例设计模式

懒汉单例模式

在类加载时不会初始化

class SingletonSluggard{
private static SingletonSluggard ss;
private SingletonSluggard(){};
//保证线程安全
public static synchronized getInstance(){
if(ss = null){
ss=new SingletonSluggard();
}
return ss;
}
}


饿汉单例模式

在类加载时就完成了初始化,所以类加载比较慢,但获取对象的速度快。

class SingletonHungry{
private static SingletonHungry sh = new SingletonHungry();
private SingletonHungry(){};
public static synchronized getInstance(){
return sh;
}


枚举实现单例模式

单例的枚举实现在《Effective Java》中有提到,因为其功能完整、使用简洁、无偿地提供了序列化机制、在面对复杂的序列化或者反射攻击时仍然可以绝对防止多次实例化等优点,单元素的枚举类型被作者认为是实现Singleton的最佳方法。

public enum SingletonEnum {
INSTANCE;
private SingletonEnum(){
}
}


我们用一个枚举实现单个数据源例子来简单验证一下:

声明一个枚举,用于获取数据库连接。

public enum DataSourceEnum{
DATASOURCE;
private DBConnection connection = null;
private DataSourceEnum{
connection = new DBConnection();
}
public DBConnection getConnection() {
return connection;
}
}


外部只能通过getConnection()来获得connection,没有其他途径,因为枚举变量是static final的,所以如果不在定义时声明,就只能在构造方法中实例花,并且有且只能实例化一次,所以保证connection对象的单例性。

工厂模式

当创建对象时,可能需要涉及到很多相关的对象被创建,如果自己创建对象则需要创建所有相关的对象,这个过程就显得非常繁琐,因此可以使用工厂模式。工厂模式就是提供创建对象的工厂,使用工厂的相关方法得到一个对象,至于创建该对象所涉及到的所有相关对象,工厂为我们创建了不需要我们自己创建。

1.简单工厂模式

提供一个工厂,在工厂内返回你要的具体“产品”

//首先提供BMW车的接口
interface BMW{};

//提供BMW系列车的类两个
class BMW3 implements BMW{
public BMW3(){
System.out.println("BMW3");
}
}
class BMW5 implements BMW{
public BMW3(){
System.out.println("BMW5");
}
}

//创建生产BMW车的工厂
class BMWFactory{
public BMW creatCar(int type){
switch(type){
case 3:
return new BWM3();
case 5:
return new BWM5();
}
}
}

//测试类
class TestCreateBMW{
public static void main(String[] args) {
BMWFactory bf = new BMWFactory();//创建一个汽车工厂
BMW b3 = bf.createCar(3);//通过工厂创建一辆3系车
BMW b5 = bf.createCar(3);//通过工厂创建一辆5系车
}
}


简单工厂模式的弊端:

新增加产品类型后,之前的工厂需要拆了重建,不利于代码扩展,简单工厂模式适合生产较少类型产品或产品类型固定的场景

工厂方法模式

提供一个工厂的接口,设立具体生产哪一系列的产品的工厂,该工厂就只提供该系列的产品,工厂方法模式的优点易扩展,解耦。



//车辆接口和车辆实现类代码同上
//提供抽象工厂
interface BMWFactory{
BMW getBMW();
}
//创建生产3系和5系的具体工厂
class BMW3Factory implements BMWFactory{
public BMW getBMW(){
return new BMW3();
}
}
class BMW5Factory implements BMWFactory{
public BMW getBMW(){
return new BMW5();
}
}
//测试类
class TestCreateBMW{
public static void main(String[] args) {
BMWFactory bf3 = new BMW3Factory();//创建一个3系汽车工厂
BMW b3 = bf3.createCar(3);//通过特定工厂创建一辆3系车
BMWFactory bf5 = new BMW5Factory();//创建一个5系汽车工厂
BMW bf5 = bf3.createCar(3);//通过特定工厂创建一辆5系车
}
}


抽象工厂模式

工厂方法模式的具体工厂除了是抽象工厂的子集,没有其他交集,他们所生产的产品也没有交集,但是如果生产该系列产品需要与该系列匹配的其它产品,则这些产品都由一个工厂生产。



/*
*生产对应系列的车内要装对应型号的空调
*/
//提供空调接口
interface KongTiao{}
//提供适合每种车系的空调类
class KT3 implements KongTiao{
public KT3(){
System.out.println("3系空调");
}
}
class KT5 implements KongTiao{
public KT5(){
System.out.println("5系空调");
}
}
//车型接口和实现类代码略
//工厂接口
interface BMWFactory{
BMW getBMW();
KongTiao getKongTiao();
}
//具体工厂生产具体车和空调
class BMW3Factory implements BMWFactory{
public BMW getBMW(){
return new BMW3();
}
public KongTiao getKongTiao(){
return new KT3();
}
}
class BMW5Factory implements BMWFactory{
public BMW getBMW(){
return new BMW5();
}
public KongTiao getKongTiao(){
return new KT5();
}
}
//测试类
public class TestCreate{
public static void main(String[] args) {
//创建3系工厂获得组合产品
BMWFactory bf3 = new BMW3Factory();
BMW b3 = bf3.getBMW();
KongTiao kt3 = bf3.getKongTiao();
//创建5系工厂获得组合产品
BMWFactory bf5 = new BMW5Factory();
BMW b5 = bf5.getBMW();
KongTiao kt5 = bf5.getKongTiao();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息