设计模式-抽象工厂模式(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),会造成客户程序和对象创建工作的紧耦合.对此,抽象工厂模 ...
随机推荐
- SyncML协议简述(和HTTP协议有点类似)
目前,移动计算和通信设备的流行很大部分原因是因为它们具有一些方便的功能,比如说在需要时可以发送信息给其他用户,用户希望随时随地都可以利用掌上设备访问信息和执行应用程序,甚至在飞行中也可以获得和更新信息 ...
- Emgu-WPF学习使用 - 颜色映射
原文:Emgu-WPF学习使用 - 颜色映射 string sFile = ""; if (!String.IsNullOrEmpty(AppConstUtils.GDefault ...
- Expander
实现折叠列表的效果 <Expander Header="水果列表"> <StackPanel> <RadioButton Content=" ...
- WPF 元素tag属性绑定一个属性或一个对象
<Window x:Class="CollectionBinding.CategoryDataTemp" xmlns="http://schemas. ...
- php 二维数组key初始化从0开始
这个是一个二维数组 array(2) { [1]=> array(2) { ["sourcesid"]=> int(1) ["addusernum" ...
- 微服务架构之「 下一代微服务 Service Mesh 」
Service Mesh 被大家称为下一代的微服务,是微服务领域的一颗新星,被大家讨论的非常多. 我在大家的讨论中,还看到有人说 “目前的微服务架构我都没学会呢,现在又来一个下一代微服务,真学不动了” ...
- 照片美妆---基于Haar特征的Adaboost级联人脸检测分类器
原文:照片美妆---基于Haar特征的Adaboost级联人脸检测分类器 本文转载自张雨石http://blog.csdn.net/stdcoutzyx/article/details/3484223 ...
- Java中动态代理技术生成的类与原始类的区别 (good)
用动态代理的时候,对它新生成的类长什么样子感到好奇.有幸通过一些资料消除了心里的疑惑. 平时工作使用的Spring框架里面有一个AOP(面向切面)的机制,只知道它是把类重新生成了一遍,在切面上加上了后 ...
- 零元学Expression Blend 4 - Chapter 18 用实例了解互动控制项「CheckBox」II
原文:零元学Expression Blend 4 - Chapter 18 用实例了解互动控制项「CheckBox」II 延续上一章的CheckBox教学,本章将以实作继续延伸更灵活的运用CheckB ...
- duilib菜单开发遇见“0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突”
我的程序是这样一个逻辑. 首先创建用户列表,点击列表项弹出菜单,点击菜单上“设备选项”,弹出设备列表,上面显示这个用户拥有的设备. 菜单的创建参考了这为博主的教程:http://www.cnblogs ...