第二章 创建型模式
1、创建型模式概述
-
主要特点 将对象的创建与使用分离”,这样可以降低系统的耦合度。 -
创建型模式分为以下几种: ⑴单例(Singleton)模式 :某个类只能生成一个实例,该类提供了一个全 局访问点供外部获取该实例,其拓展是有限多例模式。 ⑵ 原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克 隆出多个和原型类似的新实例。 ⑶ 工厂方法(Factory Method)模式:定义一个用于创建产品的接口,由子 类决定生产什么产品。 ⑷ 抽象工厂(Abstract Factory)模式:提供一个创建产品族的接口,其每 个子类可以生产一系列相关的产品。 ⑸ 建造者(Builder)模式:将一个复杂对象分解成多个相对简单的部分, 然后根据不同需要分别创建它们,最后构建成该复杂对象。
2、单例模式(Singleton)
(1)模式的定义与特点
-
定义:指一个类只有一个实例,且该类能自行创建这个实例的一 种模式。例如,Windows中的任务管理器、回收站等 -
特点: 1)单例类只有一个实例对象; 2)该单例对象必须由单例 类自行创建; 3)单例类对外提供一个访问该单例的全局访问点。
(2)模式的结构与实现
普通类的构造函数是公有的, 外部类可以通过“new 构造函数 ()”来生成多个实例。 但是如果将类的构造函数设为私有的, 外部类就无法调用它生成多个实例了。 这时该类自身必须定义一 个静态私有实例,并向外提供一 个静态的公有函数用于创建或获取该静态私有实例。
1、结构
- 单例类:包含一个实例且能自行创建这个实例的类。
- 访问者类:使用单例的类
2、实现
- 懒汉式单例:该模式的特点是类加载时没有生成单例,只有当第一次调用getInstance方法时才去创建这个单例
结构图: 代码如下:
public class LazySingleton {
private static volatile LazySingleton instance = null;
private LazySingleton() {
}
public static synchronized LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
例: 用懒汉式单例模式模拟产生美国当今总统对象。 代码: 测试类:
public class SingletonLazy {
public static void main(String[] args) {
President zt1 = President.getInstance();
zt1.getName();
President zt2 = President.getInstance();
zt2.getName();
if (zt1 == zt2) {
System.out.println("他们是同一人!");
}else {
System.out.println("他们不是同一人!");
}
}
}
President类:
class President{
private static volatile President instance=null;
private President(){ System.out.println("产生一个总统!"); }
public static synchronized President getInstance(){
if(instance==null){
instance=new President();
}else {
System.out.println("已经有一个总统,不能产生新总统!");
}
return instance;
}
public void getName() {
System.out.println("我是美国总统:特朗普。");
}
}
- 饿汉式单例:该模式的特点是类一旦加载就创建一个单例,保证在调用getInstance方法之前单例已经存在了。
代码如下:
public class HungrySingleton {
private static final HungrySingleton instance = newHungrySingleton();
private HungrySingleton() {
}
public static HungrySingleton getInstance() {
return instance;
}
}
例:用饿汉式单 例模式模拟产生猪八戒对象。 结构图: 代码如下: 测试类:
public class SingletonEager {
public static void main(String[] args) {
JFrame jf = new JFrame("饿汉单例模式测试");
jf.setLayout(new GridLayout(1, 2));
Container contentPane = jf.getContentPane();
Bajie obj1 = Bajie.getInstance();
contentPane.add(obj1);
Bajie obj2 = Bajie.getInstance();
contentPane.add(obj2);
if (obj1 == obj2) {
System.out.println("他们是同一人!");
} else {
System.out.println("他们不是同一人!");
}
jf.pack();
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
Bajie 类:
class Bajie extends JPanel {
private static Bajie instance = new Bajie();
private Bajie() {
JLabel l1 = new JLabel(new ImageIcon("src/chapter02/singleton/Bajie.jpg"));
this.add(l1);
}
public static Bajie getInstance() {
return instance;
}
}
(3)应用场景
- 某类只要求生成一个对象的时候。如:一个班中的班长
- 当对象需要被共享的场合。如:WEB中的配置对象、数据库连接池。
- 当某类需要频繁实例化,而创建对的对象又频繁被销毁的时候。如:多线程的线程池、网络连接池。
(4)扩展
例模式可扩展为有限的多例(Multiton)模式,这种模式可生成有限个实例并保存在ArrayList中,客户需要时可随机获取,通俗的说就是,创建多个单例对象,存入list中,需要的时候去取。
|