?
工厂模式就是专门负责将大量有
共同接口的类
实例化
,
而且不必事先知道每次是要实例化哪一
个类的模式。
?
工厂模式有以下几种形态
:
简单工厂
(Simple Factory)
模式
工厂方法 (Factory Method) 模式
抽象工厂 (Abstract Factory) 模式
工厂方法 (Factory Method) 模式
抽象工厂 (Abstract Factory) 模式
1.简单工厂模式
父类: 产品 (接口)
子类: 具体的产品(继承产品)
工厂类: 负责创建具体的产品
在简单工厂模式中
,
一个工厂类处于对产品类实例化调用的中心位置上
,
它决定那一个产品类应当被实例
化
,
如同一个交通警察站在来往的车辆流中
,
决定放行哪一个方向的车辆向那一个方向流动一样。
比如水果类,有多种水果
园丁(工厂)会种它们.通过工厂得到不同的水果实例
2. 工厂方法模式
?
工厂方法模式是简单工厂模式的进一步抽象化和推广。
?
它比简单工厂模式聪明的地方在于
,
它不再作为一个具
体的交通警察的面貌出现
,
而是
以交通警察局(工厂)
的面貌出现。
具体的警察成为工厂方法的执行者
。
?
工厂方法模式里
不再只由一个工厂类决定哪一个产品
类应当被实例化
,
这个决定被交给子类去作。
某种具体工厂创建某种具体产品(产品不单一,多种产品)
比如植物类,分水果类,蔬菜类
园丁(工厂)分水果类的园丁(只种水果),蔬菜类的园丁
3.抽象工厂模式
工厂分区域,产品分区域
一种区域具体的工厂不再只会创建一个种具体产品,而是能创建一个区域多种具体产品.
比如植物类,分水果类,蔬菜类,水果类和蔬菜类可以是北方种的;或南方种的.
园丁(工厂)就有南方人的园丁,北方人的园丁,他们都会种水果和蔬菜.
4.单态模式
?
一个单态类只可有一个实例。这样的类常用来
进行资源管理。
?
例如:很多软件都有数据库,一般而言,
整个
软件应当使用一个联接通道,而不是任意在需
要时就新打开一个联接通道。
通常用getInstance()得到实例.
特性:
1、单态类只可有一个实例。
2、它必须自己创立自己这唯一的一个实例。
3、它必须给所有其它的类提供自己这一实例。
最后,单态类在理论和实践上都并非限定只能有"一个"实例,而是很容易推广到任意有限个实例的情况。
2、它必须自己创立自己这唯一的一个实例。
3、它必须给所有其它的类提供自己这一实例。
最后,单态类在理论和实践上都并非限定只能有"一个"实例,而是很容易推广到任意有限个实例的情况。
饿汉式单态类
?
由于构造器是私有的,因此此类不能被继承
?
package com.javapatterns.singleton.demos;
public class EagerSingleton {
private EagerSingleton() { }
public static EagerSingleton getInstance() {
return m_instance;
}
private static final EagerSingleton m_instance =
private EagerSingleton() { }
public static EagerSingleton getInstance() {
return m_instance;
}
private static final EagerSingleton m_instance =
new
EagerSingleton();
}
}
懒汉式单态类
懒汉式单态类在第一次被引用时将自己实例化
?
构造子是私有的,因此此类不能被继承
?
public class LazySingleton {
?
private LazySingleton() {}
?
/**
?
* 静态工厂方法,返还此类的唯一实例。因为创建实例的时候,
?
* 涉及到资源初始化,所以最好使用同步机制。
?
*/
?
synchronized public static LazySingleton getInstance() {
?
if (m_instance == null) {
?
m_instance = new LazySingleton();
?
}
?
return m_instance;
?
}
?
private static LazySingleton m_instance = null;
?
}
两种单态类的比较
?
饿汉式单态类在自己被加载时就将自己实例化。
?
单从资源利用效率角度来讲,这是比懒汉式单态类稍差些。
?
从速度和反应时间角度来 讲,则比懒汉式单态类稍好些。
?
懒汉式单态类在实例化时必须处理好在多个线程同时首次引用此类时,实例化函数内部关键段的访问限制问题。
单态经常在数据库连接时使用