抽象工厂模式是向客户端提供一个接口(FruitFactory),,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族(NorthFruit、SouthFruit)的产品对象。

角色和职责:

1.抽象工厂(factory)-FruitFactory:

抽象工厂模式的核心,包含对多个产品接口的说明,任何工厂类都必须实现这个接口

2.具体工厂(concrete factory)-NorthFruitFactory、SouthFruitFactory:

负责实例化某个产品族(比如apple,apple的产品族是NorthApple、SouthApple)中的产品对象

3.抽象产品(product)-Apple、Banana:

抽象模式所创建的所有对象的父类,它负责所有实例所共有的公共接口

4.具体产品(concrete product)-NorthApple、SouthApple、NorthBanana、SouthBanana:

UML图:

具体代码:

/**
* 水果接口
*/
public interface Fruit {
void pick();
}
/**
* 抽象苹果类
*/
public abstract class Apple implements Fruit{
public abstract void pick();
}
/**
* 抽象香蕉类
*/
public abstract class Banana implements Fruit{
public abstract void pick();
}
/**
* 北方苹果
*/
public class NorthApple extends Apple{
@Override
public void pick() {
System.out.println("采摘北方苹果");
}
}
/**
* 采摘北方香蕉
*/
public class NorthBanana extends Banana{
@Override
public void pick() {
System.out.println("采摘北方香蕉");
}
}
/**
* 南方苹果
*/
public class SouthApple extends Apple{
@Override
public void pick() {
System.out.println("采摘南方苹果");
}
}
/**
* 南方香蕉
*/
public class SouthBanana extends Banana{
@Override
public void pick() {
System.out.println("采摘南方香蕉");
}
}
/**
* 水果工厂接口
*/
public interface FruitFactory {
Fruit getApple();
Fruit getBanana();
}
/**
* 北方水果工厂
*/
public class NorthFruitFactory implements FruitFactory {
@Override
public Fruit getApple() {
return new NorthApple();
} @Override
public Fruit getBanana() {
return new NorthBanana();
}
}
/**
* 南方水果工厂
*/
public class SouthFruitFactory implements FruitFactory{
@Override
public Fruit getApple() {
return new SouthApple();
} @Override
public Fruit getBanana() {
return new SouthBanana();
}
}
public class Main {
public static void main(String[] args) {
FruitFactory northFruitFactory = new NorthFruitFactory();//北方水果工厂
Fruit northApple = northFruitFactory.getApple();//生产苹果
northApple.pick();
Fruit northBanana = northFruitFactory.getBanana();//生产香蕉
northBanana.pick(); FruitFactory southFruitFactory = new SouthFruitFactory();//南方水果工厂
Fruit southApple = southFruitFactory.getApple();//生产苹果
southApple.pick();
Fruit southBanana = southFruitFactory.getBanana();//生产香蕉
southBanana.pick();
}
}

结果:

采摘北方苹果
采摘北方香蕉
采摘南方苹果
采摘南方香蕉

优缺点:

优:

  • 抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建
  • 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象
  • 增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。

缺:增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性

应用场景:

抽象工厂是应对产品族概念的。比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。

应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。

源码:https://github.com/qjm201000/design_pattern_abstractFactory.git

设计模式-抽象工厂模式(AbstractFactory)的更多相关文章

  1. 设计模式-抽象工厂模式(AbstractFactory)(创建型模式)

    //以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //Product.h #pragma once class AbstractProductA { public: vir ...

  2. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

  3. 5. 星际争霸之php设计模式--抽象工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  4. 设计模式——抽象工厂模式(AbstractFactoryPattern)

    抽象工厂模式(AbstractFactory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. UML图: IFactory: package com.cnblog.clarck ...

  5. JAVA设计模式--抽象工厂模式

    抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...

  6. 深入浅出设计模式——抽象工厂模式(Abstract Factory)

    模式动机在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法.但是有时候我们需要一个工厂可 ...

  7. 设计模式 | 抽象工厂模式(abstract factory)

    定义: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. 结构:(书中图,侵删) 这个图相对来说有一点点复杂,其实就是在工厂方法模式的基础上做了一些扩展,工厂方法模式只用于生成一种 ...

  8. 设计模式--抽象工厂模式C++实现

    抽象工厂模式C++实现 1定义 为创建一组相关或者依赖的对象提供一个接口,且无需指定他们的具体类 2类图 3实现 class AbstractProduct { protected: Abstract ...

  9. C#设计模式——抽象工厂模式(Abstract Factory Pattern)

    一.概述在软件开发中,常常会需要创建一系列相互依赖的对象,同时,由于需求的变化,往往存在较多系列对象的创建工作.如果采用常规的创建方法(new),会造成客户程序和对象创建工作的紧耦合.对此,抽象工厂模 ...

随机推荐

  1. 网络库Asio交叉编译(Linux生成ARM)

    1.  Asio是一个跨平台的C++库,用于网络和底层I/O编程.Asio使用先进的C++方式提供了一系列的异步模型 2. 官方网址:http://think-async.com 3. 由于Asio库 ...

  2. DataGridTemplateColumn

    DataGridTemplateColumn自定义单元格样式 <DataGrid Grid.Row="0" Name="BasicRuleDataGrid" ...

  3. DJango xadmin 表头和标底设置,显示隐藏和显示

    xadmin文件中的xadmin.pyfrom xadmin import views class GlobalSetting(object): site_title = "zwb" ...

  4. PHP获得指定日期所在星期的第一天和最后一天

    function getdays($day){ $lastday=date('Y-m-d',strtotime("$day Sunday")); $firstday=date('Y ...

  5. 8086 CPU 寄存器简介(超详细,图文并茂)

    http://www.cnblogs.com/BoyXiao/archive/2010/11/20/1882716.html

  6. Elevated privileges for Delphi applications

    BY CRAIG CHAPMAN · PUBLISHED 2015-06-08 · UPDATED 2015-06-08   One of my customers recently asked th ...

  7. Lucene Index Search

    转发自:  https://my.oschina.net/u/3777556/blog/1647031 什么是Lucene?? Lucene 是 apache 软件基金会发布的一个开放源代码的全文检索 ...

  8. Fundamentals Code Library,包含HTTP TCP JSON BigInteger 加密算法 Unicode等许多东西

    http://fundementals.sourceforge.net/index.html https://github.com/fundamentalslib/fundamentals5 http ...

  9. Linux 桌面玩家指南:20. 把 Linux 系统装入 U 盘打包带走

    特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...

  10. Git 常用命令大全(转)

    Git 是一个很强大的分布式版本控制系统.它不但适用于管理大型开源软件的源代码,管理私人的文档和源代码也有很多优势. Git常用操作命令: 1) 远程仓库相关命令 检出仓库:$ git clone g ...