GoF23种设计模式之创建型模式之抽象工厂模式
一、概述
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
二、适用性
1.一个系统要独立于它的产品的创建、组合和表示的时候。
2.一个系统要由多个产品系列中的一个来配置的时候。
3.当你要强调一系列相关的产品对象的设计以便进行联合使用的时候。
4.当你提供一个产品类库,而只想显示它们的接口而不是实现的时候。
三、参与者
1.AbstractFactory:声明一个创建抽象产品对象的操作接口。
2.ConcreteFactory:实现创建具体产品对象的操作。
3.AbstractProduct:为一类产品对象声明一个接口。
4.ConcreteProduct:定义一个将被相应地具体工程创建的产品对象。实现AbstractProduct接口。
5.Client:仅使用由AbstractFactory和AbstractProduct类声明的接口。
四、类图
五、示例
AbstractFactory
- package cn.lynn.abstractfactory;
- public interface IAnimalFactory {
- public IMouse createMouse();
- public ICat createCat();
- }
ConcreteFactory
- package cn.lynn.abstractfactory;
- public class WhiteAnimalFactory implements IAnimalFactory {
- @Override
- public IMouse createMouse() {
- return new WhiteMouse();
- }
- @Override
- public ICat createCat() {
- return new WhiteCat();
- }
- }
- package cn.lynn.abstractfactory;
- public class BlackAnimalFactory implements IAnimalFactory {
- @Override
- public IMouse createMouse() {
- return new BlackMouse();
- }
- @Override
- public ICat createCat() {
- return new BlackCat();
- }
- }
AbstractProduct
- package cn.lynn.abstractfactory;
- public interface IMouse {
- public void eat();
- }
- package cn.lynn.abstractfactory;
- public interface ICat {
- public void eat();
- }
ConcreteProduct
- package cn.lynn.abstractfactory;
- public class WhiteMouse implements IMouse {
- @Override
- public void eat() {
- System.out.println("白老鼠偷吃花生!");
- }
- }
- package cn.lynn.abstractfactory;
- public class BlackMouse implements IMouse {
- @Override
- public void eat() {
- System.out.println("黑老鼠偷吃花生!");
- }
- }
- package cn.lynn.abstractfactory;
- public class WhiteCat implements ICat {
- @Override
- public void eat() {
- System.out.println("白猫贪吃咸鱼!");
- }
- }
- package cn.lynn.abstractfactory;
- public class BlackCat implements ICat {
- @Override
- public void eat() {
- System.out.println("黑猫贪吃咸鱼!");
- }
- }
Client
- package cn.lynn.abstractfactory;
- public class Client {
- public static void main(String[] args) {
- IAnimalFactory whiteAnimalfactory = new WhiteAnimalFactory();
- IMouse whiteMouse = whiteAnimalfactory.createMouse();
- whiteMouse.eat();
- ICat whiteCat = whiteAnimalfactory.createCat();
- whiteCat.eat();
- IAnimalFactory blackAnimalfactory = new BlackAnimalFactory();
- IMouse blackMouse = blackAnimalfactory.createMouse();
- blackMouse.eat();
- ICat blackCat = blackAnimalfactory.createCat();
- blackCat.eat();
- }
- }
Result
- 白老鼠偷吃花生!
- 白猫贪吃咸鱼!
- 黑老鼠偷吃花生!
- 黑猫贪吃咸鱼!
GoF23种设计模式之创建型模式之抽象工厂模式的更多相关文章
- GoF23种设计模式之创建型模式之原型模式
一.概述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 二.适用性 1.当一个系统应该独立于它的产品创建.构成和表示的时候. 2.当要实例化的类是在运行时刻指定的时候,例如:通过动 ...
- GoF23种设计模式之创建型模式之工厂方法模式
一.概述 定义一个用于创建对象的接口,让子类去决定实例化哪个类.工厂方法将一个类的实例化延迟至其子类. 二.适用性 1.当一个类不知道它所必须创建的对象的类的时候. 2.当一个类希望由其子类来指定它所 ...
- GoF23种设计模式之创建型模式之建造者模式
一.概述 将一个复杂对象的构建与其表示分离开来,使得同样的构建过程可以创建不同的表示. 二.适用性 1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式的时候. 2.当构造过程必须允许 ...
- GoF23种设计模式之创建型模式之单态模式
1概述 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 2适用性 1.当类只能有一个实例而且客户可以从一个总所周知的访问点访问它的时候. 2.当这个唯一实例应该是通过子类化可扩展的,并且客户应 ...
- Java设计模式(3)——创建型模式之抽象工厂模式(Abstract Factory)
一.概述 抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象. UML图: 其他的过多概念不再 ...
- java设计模式 -------- 创建模式 之 抽象工厂模式
本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 工厂方法模式和抽象工厂模式不好区分清楚: 工厂方法模式特点: 1. 一个抽象产品 ...
- [19/04/23-星期二] GOF23_创建型模式(工厂模式、抽象工厂模式)
一.工厂模式(分为:简单工厂模式.工厂方法模式.抽象工厂模式) 实现了创建者和调用者的分离 核心本质:1.实例化对象,用工厂方法代替new操作:2.将选择实现类.创建对象统一管理和控制,从而将调用者跟 ...
- Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)
Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...
- python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)
十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...
随机推荐
- C#常用控件的属性以及方法(转载)
-----以前看别人的,保存了下来,但是忘了源处,望见谅. C#常用控件属性及方法介绍 目录 1.窗体(Form) 2.Label (标签)控件 3.TextBox(文本框)控件 4.RichText ...
- SpringBoot | 第二十四章:日志管理之AOP统一日志
前言 上一章节,介绍了目前开发中常见的log4j2及logback日志框架的整合知识.在很多时候,我们在开发一个系统时,不管出于何种考虑,比如是审计要求,或者防抵赖,还是保留操作痕迹的角度,一般都会有 ...
- Cmd命令 关机
at 22:00 Shutdown -s 到了22点电脑就会出现"系统关机"对话框,默认有30秒钟的倒计时并提示你保存工作 Shutdown.exe -s -t 3600 这里表示 ...
- xp_delete_files不起作用解决方法
xp_delete_file用来删除数据库的备份文件和维护计划文本报告.示例: ,N'D:\Backup\Diff',N'bak',N'2019-05-29T10:03:41' 第一个参数表示文件类型 ...
- JavaScript and Ruby in ABAP
Netweaver里有个mini JavaScript engine CL_JAVA_SCRIPT, 对于Js code的编译和执行都是用system call完成. 只能当玩具用:report SJ ...
- WCF的问题
使用service调用WCF的时候,有时候会出现 其他信息: HTTP 无法注册 URL 进程不具有此命名空间的访问权限 这样的问题,这时候就需要进行如下尝试: 1,VS的管理权限使用管理员的权限. ...
- UVA 1213 - Sum of Different Primes(递推)
类似一个背包问题的计数问题.(虽然我也不记得这叫什么背包了 一开始我想的状态定义是:f[n = 和为n][k 个素数]. 递推式呼之欲出: f[n][k] = sigma f[n-pi][k-1]. ...
- Angular4中常用管道
通常我们需要使用管道实现对数据的格式化,Angular4中的管道和之前有了一些变化,下面说一些常用的管道. 一.大小写转换管道 uppercase将字符串转换为大写 lowercase将字符串转换为小 ...
- CDQ分治入门
前言 \(CDQ\)分治是一个神奇的算法. 它有着广泛的用途,甚至在某些题目中还能取代\(KD-Tree\).树套树等恶心的数据结构成为正解,而且常数还小得多. 不过它也有一定的缺点,如必须离线操作, ...
- 初学Python遇到的坑
问题一 脚本内容 MacBookPro:Desktop mac$ cat wike.py #!/usr/bin/python from urllib.request import urlopen fr ...