抽象工厂
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
抽象工厂模式(Abstract Factory)是一个比较复杂的创建型模式。
抽象工厂模式和工厂方法不太一样,它要解决的问题比较复杂,不但工厂是抽象的,产品是抽象的,而且有多个产品需要创建,因此,这个抽象工厂会对应到多个实际工厂,每个实际工厂负责创建多个实际产品:
                                ┌────────┐
                             ─ >│ProductA│
┌────────┐    ┌─────────┐   │   └────────┘
│ Client │─ ─>│ Factory │─ ─
└────────┘    └─────────┘   │   ┌────────┐
                   ▲         ─ >│ProductB│
           ┌───────┴───────┐    └────────┘
           │               │
      ┌─────────┐     ┌─────────┐
      │Factory1 │     │Factory2 │
      └─────────┘     └─────────┘
           │   ┌─────────┐ │   ┌─────────┐
            ─ >│ProductA1│  ─ >│ProductA2│
           │   └─────────┘ │   └─────────┘
               ┌─────────┐     ┌─────────┐
           └ ─>│ProductB1│ └ ─>│ProductB2│
               └─────────┘     └─────────┘
 
这种模式有点类似于多个供应商负责提供一系列类型的产品。
对比
工厂方法模式和抽象工厂模式不好分清楚,他们的区别如下:
 工厂方法模式:
 一个抽象产品类,可以派生出多个具体产品类。
 一个抽象工厂类,可以派生出多个具体工厂类。
 每个具体工厂类只能创建一个具体产品类的实例。
 抽象工厂模式:
 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
 一个抽象工厂类,可以派生出多个具体工厂类。
 每个具体工厂类可以创建多个具体产品类的实例,也就是创建的是一个产品线下的多个产
 品。
 区别:
 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多
 个。
 工厂方法创建 “一种” 产品,他的着重点在于"怎么创建",也就是说如果你开发,你的大量
 代码很可能围绕着这种产品的构造,初始化这些细节上面。也因为如此,类似的产品之间有
 很多可以复用的特征,所以会和模版方法相随。
 抽象工厂需要创建一些列产品,着重点在于"创建哪些"产品上,也就是说,如果你开发,你
 的主要任务是划分不同差异的产品线,并且尽量保持每条产品线接口一致,从而可以从同一
 个抽象工厂继承。
 对于 java 来说,你能见到的大部分抽象工厂模式都是这样的:
 —它的里面是一堆工厂方法,每个工厂方法返回某种类型的对象。
 比如说工厂可以生产鼠标和键盘。那么抽象工厂的实现类(它的某个具体子类)的对象都可
 以生产鼠标和键盘,但可能工厂 A 生产的是罗技的键盘和鼠标,工厂 B 是微软的。
这样 A 和 B 就是工厂,对应于抽象工厂;
 每个工厂生产的鼠标和键盘就是产品,对应于工厂方法;
 用了工厂方法模式,你替换生成键盘的工厂方法,就可以把键盘从罗技换到微软。但是用了
 抽象工厂模式,你只要换家工厂,就可以同时替换鼠标和键盘一套。如果你要的产品有几十
 个,当然用抽象工厂模式一次替换全部最方便(这个工厂会替你用相应的工厂方法)
 所以说抽象工厂就像工厂,而工厂方法则像是工厂的一种产品生产线
单例模式
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
单例模式(Singleton)的目的是为了保证在一个进程中,某个类有且仅有一个实例。
因为这个类只有一个实例,因此,自然不能让调用方使用new Xyz()来创建实例了。所以,单例的构造方法必须是private,这样就防止了调用方自己创建实例,但是在类的内部,是可以用一个静态字段来引用唯一创建的实例的:
public class Singleton {
    // 静态字段引用唯一实例:
    private static final Singleton INSTANCE = new Singleton();
    // private构造方法保证外部无法实例化:
    private Singleton() {
    }
}
 
那么问题来了,外部调用方如何获得这个唯一实例?
答案是提供一个静态方法,直接返回实例:
public class Singleton {
    // 静态字段引用唯一实例:
    private static final Singleton INSTANCE = new Singleton();
    // 通过静态方法返回实例:
    public static Singleton getInstance() {
        return INSTANCE;
    }
    // private构造方法保证外部无法实例化:
    private Singleton() {
    }
}
 
或者直接把static变量暴露给外部:
public class Singleton {
    // 静态字段引用唯一实例:
    public static final Singleton INSTANCE = new Singleton();
    // private构造方法保证外部无法实例化:
    private Singleton() {
    }
}
 
所以,单例模式的实现方式很简单:
- 只有
private构造方法,确保外部无法实例化; - 通过
private static变量持有唯一实例,保证全局唯一性; - 通过
public static方法返回此唯一实例,使外部调用方能获取到实例。 
单例对象(Singleton)是一种常用的设计模式。在 Java 应用中,单例对象能保证在一个 JVM
 中,该对象只有一个实例存在。这样的模式有几个好处:
 1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。
 2、省去了 new 操作符,降低了系统内存的使用频率,减轻 GC 压力。
 3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全
 乱了。(比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,
 才能保证核心交易服务器独立控制整个流程。
下载链接
 https://download.csdn.net/download/qq_15604349/75668444
                    
                
                
            
        
浙公网安备 33010602011771号