Java 设计模式之抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
介绍
意图
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
主要解决
主要解决接口选择的问题。
何时使用
系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
如何解决
在一个产品族里面,定义多个产品。
关键代码
在一个工厂里聚合多个同类产品。
应用实例
工作了,为了参加一些聚会,肯定有两套或多套衣服吧,比如说有商务装(成套,一系列具体产品)、时尚装(成套,一系列具体产品),甚至对于一个家庭来说,可能有商务女装、商务男装、时尚女装、时尚男装,这些也都是成套的,即一系列具体产品。假设一种情况(现实中是不存在的,要不然,没法进入共产主义了,但有利于说明抽象工厂模式),在您的家中,某一个衣柜(具体工厂)只能存放某一种这样的衣服(成套,一系列具体产品),每次拿这种成套的衣服时也自然要从这个衣柜中取出了。用 OOP 的思想去理解,所有的衣柜(具体工厂)都是衣柜类的(抽象工厂)某一个,而每一件成套的衣服又包括具体的上衣(某一具体产品),裤子(某一具体产品),这些具体的上衣其实也都是上衣(抽象产品),具体的裤子也都是裤子(另一个抽象产品)。
优点
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点
产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
使用场景
1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。
注意事项
产品族难扩展,产品等级易扩展。
实现
我们将创建 Shape 和 Color 接口和实现这些接口的实体类。下一步是创建抽象工厂类 AbstractFactory。接着定义工厂类 ShapeFactory 和 ColorFactory,这两个工厂类都是扩展了 AbstractFactory。然后创建一个工厂创造器/生成器类 FactoryProducer。
AbstractFactoryPatternDemo,我们的演示类使用 FactoryProducer 来获取 AbstractFactory 对象。它将向 AbstractFactory 传递形状信息 Shape(CIRCLE / RECTANGLE / SQUARE),以便获取它所需对象的类型。同时它还向 AbstractFactory 传递颜色信息 Color(RED / GREEN / BLUE),以便获取它所需对象的类型。
步骤一
为形状创建一个接口。
public interface Shape {void draw();
}
步骤二
创建实现接口的实体类。
public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Inside Rectangle::draw() method.");}
}
public class Square implements Shape {@Overridepublic void draw() {System.out.println("Inside Square::draw() method.");}
}
public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Inside Circle::draw() method.");}
}
步骤三
为颜色创建一个接口
public interface Color {void fill();
}
步骤4
创建实现接口的实体类。
public class Red implements Color {@Overridepublic void fill() {System.out.println("Inside Red::fill() method.");}
}
public class Green implements Color {@Overridepublic void fill() {System.out.println("Inside Green::fill() method.");}
}
public class Blue implements Color {@Overridepublic void fill() {System.out.println("Inside Blue::fill() method.");}
}
步骤 5
为 Color 和 Shape 对象创建抽象类来获取工厂。
public abstract class AbstractFactory {public abstract Color getColor(String color);public abstract Shape getShape(String shape) ;
}
步骤 6
创建扩展了 AbstractFactory 的工厂类,基于给定的信息生成实体类的对象。
public class ShapeFactory extends AbstractFactory {@Overridepublic Shape getShape(String shapeType){if(shapeType == null){return null;} if(shapeType.equalsIgnoreCase("CIRCLE")){return new Circle();} else if(shapeType.equalsIgnoreCase("RECTANGLE")){return new Rectangle();} else if(shapeType.equalsIgnoreCase("SQUARE")){return new Square();}return null;}@Overridepublic Color getColor(String color) {return null;}
}
public class ColorFactory extends AbstractFactory {@Overridepublic Shape getShape(String shapeType){return null;}@Overridepublic Color getColor(String color) {if(color == null){return null;} if(color.equalsIgnoreCase("RED")){return new Red();} else if(color.equalsIgnoreCase("GREEN")){return new Green();} else if(color.equalsIgnoreCase("BLUE")){return new Blue();}return null;}
}
步骤 7
创建一个工厂创造器/生成器类,通过传递形状或颜色信息来获取工厂。
public class FactoryProducer {public static AbstractFactory getFactory(String choice){if(choice.equalsIgnoreCase("SHAPE")){return new ShapeFactory();} else if(choice.equalsIgnoreCase("COLOR")){return new ColorFactory();}return null;}
}
步骤 8
使用 FactoryProducer 来获取 AbstractFactory,通过传递类型信息来获取实体类的对象。
public class AbstractFactoryPatternDemo {public static void main(String[] args) {//获取形状工厂AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");//获取形状为 Circle 的对象Shape shape1 = shapeFactory.getShape("CIRCLE");//调用 Circle 的 draw 方法shape1.draw();//获取形状为 Rectangle 的对象Shape shape2 = shapeFactory.getShape("RECTANGLE");//调用 Rectangle 的 draw 方法shape2.draw();//获取形状为 Square 的对象Shape shape3 = shapeFactory.getShape("SQUARE");//调用 Square 的 draw 方法shape3.draw();//获取颜色工厂AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");//获取颜色为 Red 的对象Color color1 = colorFactory.getColor("RED");//调用 Red 的 fill 方法color1.fill();//获取颜色为 Green 的对象Color color2 = colorFactory.getColor("Green");//调用 Green 的 fill 方法color2.fill();//获取颜色为 Blue 的对象Color color3 = colorFactory.getColor("BLUE");//调用 Blue 的 fill 方法color3.fill();}
}
步骤 9
执行程序,输出结果:
Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.
Inside Red::fill() method.
Inside Green::fill() method.
Inside Blue::fill() method.
Java 设计模式之抽象工厂模式相关推荐
- JAVA设计模式之抽象工厂模式
本文继续介绍23种设计模式系列之抽象工厂模式. 前面已经介绍过简单工厂模式和工厂方法模式,这里继续介绍第三种工厂模式-抽象工厂模式,还是以汽车的制造为例. 例子背景: 随着客户的要求越来越高,宝马车需 ...
- Java设计模式之 抽象工厂模式实验报告书
目录 Java设计模式之 1 抽象工厂模式实验报告书 1 实验四:抽象工厂模式 2 一.实验目的 2 二.实验内容 2 三.实验步骤 2 3.1抽象工厂模式:电器工厂 2 3.2 car 6 3.3 ...
- Java设计模式:抽象工厂模式
1. 定义 抽象工厂模式,即Abstract Factory Pattern,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类:具体的工厂负责实现具体的产品实例. 抽象工厂模式与工厂 ...
- 最简单java设计模式:抽象工厂模式
前言 在前一篇文章讲解了一下简单工厂模式和工厂方法模式,这篇文章再把抽象工厂模式讲解一下. 一.什么是抽象工厂模式 抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的.抽象工厂模式可以向客户端提 ...
- JAVA设计模式之抽象工厂模式和代理模式
目录 一.抽象工厂模式 1.1.模式的定义与特点 1.2.模式的结构 二.代理模式 2.1代理模式的定义与特点 2.2代理模式的结构与实现 一.抽象工厂模式 1.1.模式的定义与特点 抽象工厂(Abs ...
- JAVA设计模式之——抽象工厂模式
文章目录 一.类型 二.定义 三.参与者 四.类图 五.示例 六.适用情况 参考文章 一.类型 创建型模式 二.定义 定义一个接口,用于创建一组相关或有依赖关系的对象,而且无需指定这些对象具体的类. ...
- Java设计模式:抽象工厂模式--农场的季节生产对应水果举例
/*** 农场的抽象.不同季节生产不同的蔬菜和水果.*/ public interface Farm {//不同季节,不同蔬菜和水果.int WINTER = 1; //冬季.int SUMMER = ...
- 设计模式三—抽象工厂模式
设计模式三-抽象工厂模式 一.定义 抽象工厂模式是工厂方法模式的进一步抽象.如果产品簇中只有一种产品,则退化为工厂方法模式. 二.原理图 三.代码实例 * 苹果和土豆是园丁1的杰作 * 葡萄和西红柿是 ...
- java设计模式3种工厂模式
java设计模式3种工厂模式 2010-01-08 16:06:36| 分类: JAVA技术|举报|字号 订阅 下载LOFTER客户端 工厂模式分为三种: Simple Factory模式 专门定义 ...
最新文章
- metasploit 快速入门(二)信息收集和扫描-续
- 配置ASA 7.x to Router LAN−to−LAN IPsec Tunnel
- DbSetT().Where(e = true)之后再想Include怎么办?
- 字符串表示的大整数相乘
- java 多线程集合操作_多线程中使用Java集合类
- 《C语言点滴》一1.5 内功修炼
- linux查看目录下文件个球,球服务翻译……只找到以前版本的。新版的服务名称改了……...
- JavaScript(五)——错误处理
- 电脑怎么结束进程_结束员工电脑进程/活动窗口的软件
- Linux最常用的基础命令 下篇
- web安全这个行业的前景怎么样?
- 漫谈Google的Native Client(NaCl)技术(二)–技术篇(兼谈LLVM)
- C#——await与async实现多线程异步编程
- 华为HG8120C光猫换天邑TEWA-600AGM(百兆换千兆)的过程记录
- Java 堆排序(大根堆及小根堆)
- 计算机辅助公差技术主要研究内容,计算机辅助形位公差类型生成技术的分析研究.pdf...
- PS制作logo图片
- vue项目中实现汉字转拼音缩写
- 计算机学渣和你说说从毕业到工作
- 图片服务架构演进及云存储的优势
热门文章
- linux消息信号丢失,Linux信号丢失问题分析
- 解决if-else的另一种姿势:Map + 函数式接口方法!
- Sublime Text 4首个稳定版发布:全新UI、多选项卡、支持GPU渲染
- 皮一皮:别人都那么努力,你还有什么理由不努力...
- 微信支付代金券开发包分享
- 京东数科首次公开:强一致、高性能分布式事务中间件JDTX
- PyTorch模型量化工具学习
- CVPR-2021收集
- More than one file was found with OS independent path
- Visual Studio 调试(Dubug)模式下的“未定义标识符”