抽象工厂模式是向客户端提供一个接口(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. Asp.net-MyFirstMVCProject详细解释

    一个URL要求, ASP.NET MVC引擎将分析URL要使用Controller, 这个Controller(取而代之的是,真实的方法Controller的Action)从数据库或者其它数据源获取数 ...

  2. 在Keystone V3基础上改进的分布式认证体系

    目标 使用java实现keystone v3相关功能与概念: api client authentication service discovery distributed multi-tenant ...

  3. MSRA专访摘要

    前段时间有幸参加微软亚洲研究院之旅,顺便投简历,没想到在两次访谈迎来,并且是连续 的两次被拒绝.严重的刺激到了我.导致我疯狂的复习刷Offer.如今最终算是告于段落.如今也最终有空沉下心来总结 总结近 ...

  4. Windows静态库和动态库的创建和使用(VS2005)

    偶们在实际的编程开发中,经常会遇到运行时无法找到某个DLL文件或者链接时无法找到某个LIB文件.然后,我们就开始乱GOOGLE一下,然后将VS2005的设置改变一下,或许就Ok了,我们将别人开发的DL ...

  5. Xamarin简介

    简介 简单来说,Xamarin提供了使用C#完成iOS,Android和Windows Phone三个移动平台开发的可能性Xamarin包括Xamarin.Andriod.Xamarin.IOS.Xa ...

  6. WPF 4 动态覆盖图标(Dynamic Overlay Icon)

    原文:WPF 4 动态覆盖图标(Dynamic Overlay Icon)      在<WPF 4 开发Windows 7 任务栏>一文中我们学习了任务栏的相关开发内容,同时也对覆盖图标 ...

  7. box-shadow 与 filter:drop-shadow 详解及技巧

    box-shadow 在前端的 CSS 编写工作想必十分常见.但是 box-shadow 除去它的常规用法,其实还存在许多不为人知的奇技淫巧. 喜欢 markdown 版本的可以戳这里. box-sh ...

  8. 【全面解禁!真正的Expression Blend实战开发技巧】第一章 真正的开发中的最佳的做法

    原文:[全面解禁!真正的Expression Blend实战开发技巧]第一章 真正的开发中的最佳的做法 从设计者到开发者 设计师创建一个应用程序的布局然后让开发者去实现. 从开发者到设计者 开发者创建 ...

  9. Attention is all you need及其在TTS中的应用Close to Human Quality TTS with Transformer和BERT

    论文地址:Attention is you need 序列编码 深度学习做NLP的方法,基本都是先将句子分词,然后每个词转化为对应的的词向量序列,每个句子都对应的是一个矩阵\(X=(x_1,x_2,. ...

  10. xen学习(一)

    添加镜像源 [root@xen xen]# cat /etc/yum.repos.d/xen.repo [xen] name=xenserver baseurl=http://mirrors.163. ...