设计模式-抽象工厂模式(AbstractFactory)
抽象工厂模式是向客户端提供一个接口(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)的更多相关文章
- 设计模式-抽象工厂模式(AbstractFactory)(创建型模式)
//以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //Product.h #pragma once class AbstractProductA { public: vir ...
- 设计模式——抽象工厂模式及java实现
设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...
- 5. 星际争霸之php设计模式--抽象工厂模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- 设计模式——抽象工厂模式(AbstractFactoryPattern)
抽象工厂模式(AbstractFactory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. UML图: IFactory: package com.cnblog.clarck ...
- JAVA设计模式--抽象工厂模式
抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...
- 深入浅出设计模式——抽象工厂模式(Abstract Factory)
模式动机在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法.但是有时候我们需要一个工厂可 ...
- 设计模式 | 抽象工厂模式(abstract factory)
定义: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. 结构:(书中图,侵删) 这个图相对来说有一点点复杂,其实就是在工厂方法模式的基础上做了一些扩展,工厂方法模式只用于生成一种 ...
- 设计模式--抽象工厂模式C++实现
抽象工厂模式C++实现 1定义 为创建一组相关或者依赖的对象提供一个接口,且无需指定他们的具体类 2类图 3实现 class AbstractProduct { protected: Abstract ...
- C#设计模式——抽象工厂模式(Abstract Factory Pattern)
一.概述在软件开发中,常常会需要创建一系列相互依赖的对象,同时,由于需求的变化,往往存在较多系列对象的创建工作.如果采用常规的创建方法(new),会造成客户程序和对象创建工作的紧耦合.对此,抽象工厂模 ...
随机推荐
- youwuku和koudaitong以及weimeng差异
优库通过涨势没有口袋,通过口袋里的东西优库有, 就像一个商场的处理这些极端类别似, 所不同的是:1.掌上通免费,但也开始掏腰包通过用户收费,因为一些特殊的.这意味着,天下没有免费的午餐,掌上通是使用完 ...
- thinkphp 删除所有缓存 Rumtime 以及 Html 静态缓存
<?php /** * This is not a free software, All Copyright @F.Z.B * Date: 14-8-12 下午4:08 * File: Cach ...
- NPM镜像设置方法!
使用npm安装一些包失败了的看过来(npm国内镜像介绍) 发布于 2012-4-26 04:19 最后一次编辑是 2013-12-11 23:21 这个也是网上搜的,亲自试过,非常好用! 镜像使用方法 ...
- WPF- 模拟触发Touch Events
原文:WPF- 模拟触发Touch Events 基于API: [DllImport("User32.dll")] public static extern bool Initia ...
- QRCode二维码生成方案及其在带LOGO型二维码中的应用(1)
原文:QRCode二维码生成方案及其在带LOGO型二维码中的应用(1) 提要:很多公司为商业宣传之需,常将企业LOGO加入二维码中,但如果LOGO遮挡区域足够地大,二维码就变得无法识别.那么,有没有一 ...
- WPF 通过CommandBinding捕获命令
RoutedCommand与业务逻辑无关,业务逻辑是通过CommandBinding来实现 using System; using System.Collections.Generic;using S ...
- strlen, wcslen, _mbslen, _mbslen_l, _mbstrlen, _mbstrlen_l, setlocale(LC_CTYPE, "Japanese_Japan")(MSDN的官方示例)
// crt_strlen.c // Determine the length of a string. For the multi-byte character // example to work ...
- WPF 启动唯一程序(项目,exe,实例)
原文:WPF 启动唯一程序(项目,exe,实例) 描述:用户多次快速开启WPF程序的时候 只运行起来 一个 程序(exe) 其他多开的 进程 自动关闭掉 App.xaml.cs文件 protecte ...
- Apache Cordova for ios环境配置
原文:Apache Cordova for ios环境配置 1.安装针对iOS的工具 https://technet.microsoft.com/ZH-cn/library/dn757054.aspx ...
- AndroidStudio下的依赖管理
在开发中用第三方库是很常见的事,如何在AndroidStudio下管理这些依赖呢?这就是这篇文章的目的. 目录 Maven/Ivy仓库依赖 Module依赖 aar文件依赖 jar文件依赖 例子完整代 ...