设计模式四: 抽象工厂(Abstract Factory)
简介
抽象工厂模式是创建型模式的一种, 与工厂方法不同的是抽象工厂针对的是生产一组相关的产品, 即一个产品族.
抽象工厂使用工厂方法模式来生产单一产品, 单一产品的具体实现分别属于不同的产品族. 抽象工厂即是对产品族的抽象.
工厂类一般使用单例实现(工厂方法的工厂类也是如此)
意图
定义了一个创建对象的接口,用于创建一组相关的对象.
类图

实现
组装电脑需要CPU和内存, 对于Windows和Mac来说所需的是两个不同的系列产品, Windows用Windows系列的CPU,RAM, Mac用Mac系列的CPU,RAM;
- 使用工厂模式,分别定义CPU,RAM相关的接口和实现
// 抽象产品,定义接口
public interface CPU {
}
public interface RAM {
}
// 抽象每个产品的工厂
public interface CPUFactory {
CPU createCPU();
}
public interface RAMFactory {
RAM createRAM();
}
// 实现具体产品
public class MacCPU implements CPU {
}
public class MacRAM implements RAM {
}
public class WindowsCPU implements CPU {
}
public class WindowsRAM implements RAM {
}
// 工厂方法具体实现
public class MacCPUFactory implements CPUFactory {
public CPU createCPU() {
return new MacCPU();
}
}
public class MacRAMFactory implements RAMFactory {
public RAM createRAM() {
return new MacRAM();
}
}
public class WindowsCPUFactory implements CPUFactory {
public CPU createCPU() {
return new WindowsCPU();
}
}
public class WindowsRAMFactory implements RAMFactory {
public RAM createRAM() {
return new WindowsRAM();
}
}
- 定义抽象工厂接口
/**
* 抽象工厂接口
*/
public interface PCAbstractFactory {
CPU createCPU();
RAM createRAM();
}
- 定义抽象工厂的实现
/**
* Mac的工厂实现
*/
public class MacFactory implements PCAbstractFactory{
public CPU createCPU() {
return new MacCPUFactory().createCPU();
}
public RAM createRAM() {
return new MacRAMFactory().createRAM();
}
}
/**
* Windows的工厂实现
*/
public class WindowsFactory implements PCAbstractFactory{
public CPU createCPU() {
return new WindowsCPUFactory().createCPU();
}
public RAM createRAM() {
return new WindowsRAMFactory().createRAM();
}
}
- 调用
PCAbstractFactory factory = new MacFactory();
CPU cpu = factory.createCPU();
RAM ram = factory.createRAM();
总结
优点: 1. 将产品的生产分离出来; 2. 易于改变产品系列; 3. 利于产品一致性,一次生产一系列产品
缺点: 不利于新增产品,新增则抽象工厂及工厂实现类均要增加相关对象方法
设计模式四: 抽象工厂(Abstract Factory)的更多相关文章
- 【设计模式】——抽象工厂Abstract Factory
模式意图 提供对象的使用接口,隐藏对象的创建过程. 模式结构 AbstractFactory 提供创建对象的接口. ConcreteFactory 提供真正创建对象的实现类,用于组合并创建不同的对象, ...
- 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)
在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...
- 面向对象设计——抽象工厂(Abstract Factory)模式
定义 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类.抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道或关心实际产出的具体产品是什么.这样一来,客户就能从具体的产 ...
- 设计模式——抽象工厂(Abstract Factory)
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类. ——DP UML类图 模式说明 抽象工厂与工厂方法在定义上最明显的区别是“创建一系列相关或相互依赖对象的接口”,由此可以看出抽象工 ...
- 5、抽象工厂 abstract factory 将关联组件组成产品 创建型模式
趁热打铁,紧跟着上一节的工厂方法模式.这一节介绍一下抽象工厂模式,以及分析俩个模式的不同 1.何为抽象模式? 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他 ...
- 工厂模式[3] 抽象工厂 Abstract Factory
简介 1.简单工厂,或静态工厂,产品接口 定义:专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类或实现同一接口 优点:客户端可以直接消费产品,而不必关心具体产品的实现(不关心对象的 ...
- C2:抽象工厂 Abstract Factory
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 应用场景: 一系列相互依赖的对象有不同的具体实现.提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合 UM ...
- Java 工厂模式(一)— 抽象工厂(Abstract Factory)模式
一.抽象工厂模式介绍: 1.什么是抽象工厂模式: 抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态,抽象工厂模式向客户端提供一个接口,使得客户端在不知道具体产品的情类型的情况下,创建 ...
- Headfirst设计模式的C++实现——抽象工厂(Abstract Factory)
Dough.h #ifndef _DOUGH_H #define _DOUGH_H class Dough { }; #endif ThinCrustDough.h #ifndef _THIN_CRU ...
随机推荐
- [APIO2014]序列分割
嘟嘟嘟 复习一下斜率优化,感觉已经忘得差不多了-- 这题切入点在与答案跟切的顺序无关. 证明就是假如有三段权值分别为\(x, y, z\),那么这两刀不管按什么顺序切,得到的结果都是\(xy + xz ...
- 通过supper()有参构造器,完成子类对象调用父类属性的方法,并完成赋值
package com.Summer_0426.cn; /** * @author Summer * 通过supper()有参构造器,完成子类对象调用父类属性的方法,并完成赋值 * */ public ...
- 跳跳棋[LCA+二分查找]-洛谷1852
传送门 这真是一道神仙题 虽然我猜到了这是一道LCA的题 但是... 第一遍看题,我是怎么也没想到能和树形图扯上关系 并且用上LCA 但其实其实和上一道lightoj上的那道题很类似 只不过那时一道很 ...
- matlab读取cvs文件的几种方法
matlab读取CVS文件的几种方法: 1,实用csvread()函数 csvread()函数有三种使用方法: 1.M = csvread('filename')2.M = csvread('fi ...
- JDB与迭代
要求 1 使用C(n,m)=C(n-1,m-1)+C(n-1,m)公式进行递归编程实现求组合数C(m,n)的功能 2 m,n 要通过命令行传入 3 提交测试运行截图(至少三张:正常如c(3,2).异常 ...
- UEFI和Legacy及UEFI+Legacy启动的区别
uefi和legacy是两种不同的引导方式,uefi是新式的BIOS,legacy是传统BIOS.你在UEFI模式下安装的系统,只能用UEFI模式引导:同理,如果你是在Legacy模式下安装的系统,也 ...
- PS制作科幻特效的金色立体文字
最终效果 一.Photoshop打开背景素材. 二.然后我们来制作字效,首先当然是在画布上打上字了,在这里要注意的是尽量选一些艺术字体,这样做出来的效果比较好些,我这里用到的字体为“Matura MT ...
- Python——Set集合
一.定义 Set集合用于表示相互之间无需的一种组合对象,包括:并集.交集.补集 二.集合的两种模式 sample = set() 初始化普通集合 sample = frozenset() 初始化不可 ...
- python 高阶函数之 reduce
1.正常写法 >>> from functools import reduce >>> def fn(x, y): ... return x * 10 + y .. ...
- Nim积解法小结
由于某毒瘤出题人 redbag 不得不学习一下这个史诗毒瘤算法. 本文参考了 Owaski 的 GameTheory 的课件. 定义 我们对于一些二维 \(\mathrm{Nim}\) 游戏(好像更高 ...