一、概述

  抽象工厂模式提供同一个创建一系列相关或相互依赖对象的接口,无须指定它们具体的类  

  抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。

1.1、使用场景

  客户端(应用层)不依赖于具体产品类实例如何被创建、实现等细节

  强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码

  提供一个产品类的库,所有的产品以同样的接口出现从而使客户端不依赖于具体实现

1.2、优缺点

  优点:
    1.它分离了具体的类
    2.它使得易于交换产品系列
    3.它有利于产品的一致性
  缺点:
    难以支持新种类的产品,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码
    不容易扩展,也就是可扩展性不好,抽象工厂类一改,所有的具体工厂实现类都要变化。抽象工厂模式也会造成类层次过为复杂的情况。

  与工厂方法模式:抽象工厂模式创建的是产品族,工厂方法模式创建的是单个产品,二者的实现原理都是将创建类的过程延迟到子类。

  与单例模式:抽象工厂模式里的具体工厂实现通常在整个应用中只有一个实例,因此可以把具体的实现创建为单例。

1.3、类图角色及其职责

  

   1、抽象工厂(Creator)角色:(FruitFactory)【AbstractFactory:抽象工厂,提供统一的接口工厂】
      是抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
   2、具体工厂(Concrete Creator)角色:(NorthFactory、SouthFactory)【ConcreteFactory】
      这是实现抽象工厂接口的具体工厂类,负责实例化某个产品族中的产品对象。
   3、抽象产品(Product)角色:(Fruit)【AbstractProduct】
      抽象工厂模式所创建的对象的父类,它负责描述所有实例所共有的公共接口。
   4、具体产品(Concrete Product)角色:(Apple、Banana)
      抽象模式所创建的具体实例对象。
 
   抽象工厂中方法对应产品结构,具体工厂对应产品族。

1.4、演进

  工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?

示例

  首先确定我们的产品族,产品族为南方水果与北方水果,而水果(产品等级)有苹果和香蕉产品等级,所以具体产品为南方苹果,北方苹果,南方香蕉,北方香蕉。
  具体代码如下:首先每一个族中都有苹果和香蕉,所以定义两个抽象类,其中包含一个抽象方法

基础类

Fruit接口

public interface Fruit {
void get();

苹果以及香蕉基础抽象类

public abstract class Apple implements Fruit {
public abstract void get();
}
public abstract class Banana implements Fruit{
public abstract void get();
}

在写苹果香蕉的具体产品,并各自继承对应的抽象类

  北方苹果

public class NorthApple extends Apple {
@Override
public void get() {
System.out.println("采集北方苹果");
}
}

  南方苹果

public class SouthApple extends Apple {
@Override
public void get() {
System.out.println("采集南方苹果");
}
}

  北方香蕉

public class NorthBanana extends Banana {
@Override
public void get() {
System.out.println("采集北方香蕉");
}
}

  南方香蕉

public class SouthBanana extends Banana {
@Override
public void get() {
System.out.println("采集南方香蕉");
}
}

接下来创建工厂,而每一个产品族都对应一个具体的工厂,每个产品族都包含苹果和香蕉,所以每个工厂中都包含苹果和香蕉

抽象工厂

public interface FruitFactory {
//实例化一个苹果
Fruit getApple(); //实例化一个香蕉
Fruit getBanana();

  北方工厂

public class NorthFactory implements FruitFactory{
@Override
public Fruit getApple() {
return new NorthApple();
} @Override
public Fruit getBanana() {
return new NorthBanana();
}
}

  南方工厂

public class SouthFactory implements FruitFactory{
@Override
public Fruit getApple() {
return new SouthApple();
} @Override
public Fruit getBanana() {
return new SouthBanana();
}
}

测试

    @Test
public void testFactory(){
FruitFactory nf = new NorthFactory(); Fruit nApple = nf.getApple();
nApple.get(); Fruit nBanana = nf.getBanana();
nBanana.get(); FruitFactory sf = new SouthFactory(); Fruit sApple = sf.getApple();
sApple.get(); Fruit sBanana = sf.getBanana();
sBanana.get();

上述类图

  

  这时如果想新增一个产品族热带水果,只需新建一个热带产品族的工厂即可,已经建好的南方与北方工厂无需改动,也符合开放-封闭原则。

  但缺点也很明显,从产品等级来看,如果想新增一个产品等级,例如上面的例子只有苹果与香蕉,如果现在新增一个葡萄,就需要在抽象工厂中添加一个葡萄抽象方法,再在每一个具体工厂中实现此方法。这样就完全不符合开放-封闭原则了。

二、扩展

java.sql.Connection

java.sql.Statement

sqlsessionfactory

002-创建型-02-抽象工厂模式(Abstract Factory)的更多相关文章

  1. 创建型设计模式之工厂模式(Abstract Factory)

    结构            意图         提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性     一个系统要独立于它的产品的创建.组合和表示时. 一个系统要由多个 ...

  2. 【设计模式】抽象工厂模式 Abstract Factory Pattern

    简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...

  3. .NET设计模式(2):1.2 抽象工厂模式(Abstract Factory)

    概述 抽象工厂模式(Abstract Factory)是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口 ...

  4. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...

  5. 设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释

    抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2709 ...

  6. 抽象工厂模式(Abstract Factory)C#实例

    抽象工厂模式(Abstract Factory)C#实例 本文出处http://www.dofactory.com/net/abstract-factory-design-pattern 一.场景描述 ...

  7. 二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)

    抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Messag ...

  8. 【UE4 设计模式】抽象工厂模式 Abstract Factory Pattern

    概述 描述 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类:具体的工厂负责实现具体的产品实例 抽象工厂中每个工厂可以创建多种产品(如苹果公司生产iPhone.iPad): 工厂方法 ...

  9. Objective-C设计模式——抽象工厂模式Abstract Factory(对象创建)

    抽象工厂模式 理解了工厂方法模式,其实抽象工厂和工厂方法模式有很多的相似之处.抽象工厂同样是分离客户端对象的创建和逻辑代码的,但是抽象工厂往往是产生一组数据而不单单是产生一个产品. 抽象工厂提供一个创 ...

  10. 六个创建模式之抽象工厂模式(Abstract Factory Pattern)

    问题: 使用工厂方法模式的主要问题是工厂类过多,每个产品对应一个工厂,不利于维护.因此可以考虑使用一个工厂创建一个产品族. 定义: 提供创建一些列相关或相互依赖的对象实例的接口,这些类可以称为一个产品 ...

随机推荐

  1. 运维开发笔记整理-创建django用户

    运维开发笔记整理-创建django用户 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.创建普通用户 C:\Users\yinzhengjie\softwares\Pycharm ...

  2. Pytohn笔记(31)----第三方包

    摘自: https://www.jianshu.com/p/bbc8672a2d09 一. from __future__ import **** [版本更新之后想在原来的版本使用新版本的一些功能] ...

  3. RollingRegression(滚动回归分析)之Python实现

    # -*- coding: utf-8 -*-"""Created on Sat Aug 18 11:08:38 2018 @author: acadsoc"& ...

  4. Oracle LOB 大对象处理

    LOB类型列主要是用来存储大量数据的数据库字段,最大可以存储4G字节的非结构化数据. 一.LOB数据类型分类 1.按存储数据的类型分: ①字符类型:   CLOB:存储大量 单字节 字符数据.   N ...

  5. js+css 动效+1的效果

    点击数值 +1 的动效 vue data:{ timer: null,plus:''// 次数 } method:{ animate(plus) { var _this = this; clearIn ...

  6. python - pycharm 配置虚拟环境出现的中文命名问题

    说一个困扰我很久的问题,当使用 pycharm 配置新的虚拟环境想要与之前的环境隔离的时候,正常的点击 New Project 创建项目时,不勾选 Inherit global site-packag ...

  7. git合并之 merge和rebase

    合并有两种方法: git rebase 和git merge 优先用 rebase!!!! 区别: 1. 使用git merge git checkout dev git merge master 或 ...

  8. js中的数据类型以及转换

    Js中的数据类型 Js中的数据类型一共有六种,即number,string,boolean,underfine,null,object. 一,number Number数据类型指的是数字,可以为整型, ...

  9. Spring AOP的作用,动态代理模式

    AOP即面向切面编程.AOP是基于代理模式的. 代理模式: 当我们需要修改一个类,在类中加入代码时,为了不破坏这个类的封装性.可以使用代理模式,建立一个代理类. 比如:修改需求,在调用UserCont ...

  10. PostgreSQL10.5 - 创建索引的思考

    总体感觉整个索引创建的比较慢,PostgreSQL10没有并行创建索引的功能,所以执行过程中,仅用到了服务器的一个核心来执行计算.索引创建是一个高CPU消耗的工作,CPU基本会跑满,会用到backen ...