Java设计模式之——抽象工厂
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
步骤 1
为形状创建一个接口。
packagecom.demo.mode.mode01.abstractFactory.Shape.java public interface Shape { void draw(); }
步骤 2
创建实现接口的实体类。
package com.demo.mode.mode01.abstractFactory.Rectangle.java public class Rectangle implements Shape { public void draw() { System.out.println("execute Rectangle::draw()method."); } } package com.demo.mode.mode01.abstractFactory.Square.java public class Square implements Shape { public void draw() { System.out.println("execute Circle::draw()method."); } } package com.demo.mode.mode01.abstractFactory.Circle.java public class Circle implements Shape { public void draw() { System.out.println("execute Circle::draw()method."); } }
步骤 3
为颜色创建一个接口。
package com.demo.mode.mode01.abstractFactory.Color.java public interface Color { // 填充颜色 void fill(); }
步骤4
创建实现接口的实体类。
package com.demo.mode.mode01.abstractFactory.Red.java public class Red implements Color { public void fill() { System.out.println("execute Red::fill()method."); } } package com.demo.mode.mode01.abstractFactory.Green.java public class Green implements Color { public void fill() { System.out.println("execute Green::fill()method."); } } package com.demo.mode.mode01.abstractFactory.Blue.java public class Blue implements Color { public void fill() { System.out.println("execute Blue::fill()method."); } }
步骤 5
为 Color 和 Shape 对象创建抽象类来获取工厂。
package com.demo.mode.mode01.abstractFactory.AbstractFactory.java public abstract class AbstractFactory { abstract Color getColor( String color); abstract Shape getShape( String shape); }
步骤 6
创建扩展了 AbstractFactory 的工厂类,基于给定的信息生成实体类的对象。
package com.demo.mode.mode01.abstractFactory.ShapeFactory.java public class ShapeFactory extends AbstractFactory{ /** * 使用 getShape 方法获取形状类型的对象 * @author xg.qiu<br/> * @since JDK 1.7 * @time Jul 28, 2015 * @param shapeType 形状类型 * @return shape对象 */ public Shape getShape(String shapeType) { Shape shape = null; if ("Circle".equals(shapeType)) { shape = new Circle(); } else if ("Rectangle".equals(shapeType)) { shape = new Rectangle(); } else if ("Square".equals(shapeType)) { shape = new Square(); } return shape; } public Color getColor(String color) { return null; } } package com.demo.mode.mode01.abstractFactory.ColorFactory.java public class ColorFactory extends AbstractFactory { /** * 使用 getColor 获得颜色 * @author xg.qiu<br/> * @since JDK 1.7 * @time Jul 28, 2015 * @param colorStr 颜色字符串 * @return color对象 */ public Color getColor(String colorStr) { Color color = null; if ("Red".equalsIgnoreCase(colorStr)) { color = new Red(); } else if ("Green".equalsIgnoreCase(colorStr)) { color = new Green(); } else if ("Blue".equalsIgnoreCase(colorStr)) { color = new Blue(); } return color; } public Shape getShape(String shape) { return null; } }
步骤 7
创建一个工厂创造器/生成器类,通过传递形状或颜色信息来获取工厂。
package com.demo.mode.mode01.abstractFactory.FactoryProducer.java public class FactoryProducer { public static AbstractFactory getFactory(String choice){ AbstractFactory factory = null; if("Shape".equalsIgnoreCase(choice)){ factory = new ShapeFactory(); }else if("Color".equalsIgnoreCase(choice)){ factory = new ColorFactory(); } return factory; } }
步骤 8
使用 FactoryProducer 来获取 AbstractFactory,通过传递类型信息来获取实体类的对象。
package com.demo.mode.mode01.abstractFactory.AbstractFactoryPatternDemo.java public class AbstractFactoryPatternDemo { public static void main(String[] args) { //1.获取形状 AbstractFactory shapeFactory = FactoryProducer.getFactory("Shape"); //2.获取颜色 AbstractFactory colorFactory = FactoryProducer.getFactory("Color"); //3.传递形状 Shape shape =shapeFactory.getShape("Circle"); //4.传递颜色 Color color =colorFactory.getColor("Red"); //5.绘制形状 shape.draw(); //6.填充颜色 color.fill(); } }
步骤 9
验证输出。
execute Circle::draw() method. execute Red::fill() method.
Java设计模式之——抽象工厂的更多相关文章
- Java 设计模式之抽象工厂模式(三)
原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...
- Java设计模式系列-抽象工厂模式
原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755412.html 一.概述 抽象工厂模式是对工厂方法模式的再升级,但是二者面对的场景稍显差别. ...
- java设计模式之抽象工厂模式
上一篇文章(http://www.cnblogs.com/liaoweipeng/p/5768197.html)讲了简单工厂模式,但是简单工厂模式存在一定的问题,如果想要拓展程序,必须对工厂类进行修改 ...
- java设计模式(三)--抽象工厂模式
转载:http://zz563143188.iteye.com/blog/1847029 前面的工厂方法模式虽然清晰,但还是感觉有些繁琐,通常使用的还是抽象工厂模式. 工厂方法模式有一个问题就是,类的 ...
- [译]Java 设计模式之抽象工厂
(文章翻译自Java Design Pattern: Abstract Factory) 抽象工厂模式针对工厂模式增加了抽象层.如果我们使用抽象工厂模式和工厂模式比较的话,很明显抽象工厂模式增加了一个 ...
- Java设计模式之抽象工厂
概述 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性. 设计模式 ...
- Java 设计模式之抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽 ...
- [java] java 设计模式(2):抽象工厂模式(Abstract Factory)
工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这 ...
- Java设计模式(3)——抽象工厂模式
抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的.抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象. 一.产品族和产品等级结构 为 ...
随机推荐
- windows客户端远程访问linux下mysql方法
windows客户端远程访问linux下mysql方法 1. 改表法.可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 &q ...
- 64位ubuntu下Android开发环境的配置
本文介绍如何在64位ubuntu上搭建android的开发环境. 系统:ubuntu12.04LTS 使用的是ADT Bundle for Linux和jdk1.7(open jdk也可) 一共分为3 ...
- hiho1601最大分数 DP
#1601 : 最大得分 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在玩一个游戏.给定一个数组A=[A1, A2, ... AN],小Hi可以指定M个 ...
- Luogu1155 NOIP2008 双栈排序 【二分图染色】【模拟】
Luogu1155 NOIP2008 双栈排序 题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过 2个栈 S1 和 S2 ,Tom希望借助以下 44 种操作实现将输入序列升序排序. 操作 ...
- 1153 Decode Registration Card of PAT (25 分)
A registration card number of PAT consists of 4 parts: the 1st letter represents the test level, nam ...
- Gridview实现突出显示某一单元格的方法
GridView突出显示某一单元格(例如金额低于多少,分数不及格等) 效果图: 解决方案:主要是绑定后过滤 GridView1.DataBind(); for (int i = 0; i ...
- Python 3 利用 Dlib 实现人脸检测和剪切
0. 引言 利用 Python 开发,借助 Dlib 库进行人脸检测 / face detection 和剪切: 1. crop_faces_show.py : 将检测到的人脸剪切下来,依次排序平 ...
- springboot各种集成
fastjson 两个方法 @Configuration public class WebMvcConfigurer extends WebMvcConfigurerAdapter { @Overri ...
- centos vi显示中文
1. 控制台终端显示中文 修改 /etc/sysconfig/i18n 文件如下: #LANG="en_US.UTF-8"LANG="zh_CN.GB2312" ...
- angularJS自定义一个过滤器
ng允许我们自定义指令 下面来我们自己来定义一个过滤指令:filter,返回一个函数的形式 filter(name,callback(){//name:过滤器的名字,callback:匿名函数 ret ...