查看“设计模式:抽象工厂模式”的源代码
←
设计模式:抽象工厂模式
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[category:设计模式]] == 关于 == <pre> 前面介绍的“工厂方法模式”工厂方法模式只考虑生产同等级的产品(如畜牧场只养动物、电视机厂只生产电视机、计算机软件学院只培养计算机软件专业的学生等)。 而“抽象工厂模式”将考虑多等级产品的生产,将同一个具体工厂所生产的位于不同等级的一组产品称为一个'''产品族'''。 </pre> 抽象工厂(AbstractFactory)模式的定义:是一种'''为访问类提供一个创建一组相关或相互依赖对象的接口''',且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。 使用抽象工厂模式一般要满足以下条件: # 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。 # 系统一次只可能消费其中某一族产品,即同族的产品一起使用。 优点: *(具有工厂方法模式的优点) * 可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。 * 当需要产品族时,抽象工厂可以保证客户端始终只使用同一个产品的产品组。 * 抽象工厂增强了程序的可扩展性,'''当增加一个新的产品族时,不需要修改原代码,满足开闭原则'''。 缺点: * '''当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改'''。增加了系统的抽象性和理解难度。 == 结构与实现 == 抽象工厂模式同工厂方法模式一样,也是由抽象工厂、具体工厂、抽象产品和具体产品等 4 个要素构成,但抽象工厂中方法个数不同,抽象产品的个数也不同。 抽象工厂模式的主要角色如下: # '''抽象工厂'''(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),'''可以创建多个不同等级的产品'''。 # '''具体工厂'''(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。 # '''抽象产品'''(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。 # '''具体产品'''(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,'''它同具体工厂之间是多对一的关系'''。 其结构图如下: : [[File:设计模式:抽象工厂模式.png|600px]] 其代码如下: # 抽象工厂:提供了产品的生成方法。 #: <syntaxhighlight lang="java" highlight=""> interface AbstractFactory { public Product1 newProduct1(); public Product2 newProduct2(); } </syntaxhighlight> # 具体工厂:实现了产品的生成方法。 #: <syntaxhighlight lang="java" highlight=""> class ConcreteFactory1 implements AbstractFactory { public Product1 newProduct1() { System.out.println("具体工厂 1 生成-->具体产品 11..."); return new ConcreteProduct11(); } public Product2 newProduct2() { System.out.println("具体工厂 1 生成-->具体产品 21..."); return new ConcreteProduct21(); } } </syntaxhighlight> === 示例 === # 抽象工厂类:AbstractFactory # 工厂类:ShapeFactory、ColorFactory # 抽象产品类:Shape、Color # 产品类:Rectangle、Square、Circle;Red、Green、Blue #(工厂创造器/生成器类:FactoryProducer) 测试类 AbstractFactoryPatternDemo 使用 FactoryProducer 来获取 AbstractFactory 对象,它将向 AbstractFactory 传递形状信息 Shape(CIRCLE / RECTANGLE / SQUARE),以便获取它所需对象的类型。同时它还向 AbstractFactory 传递颜色信息 Color(RED / GREEN / BLUE),以便获取它所需对象的类型。 其结构图如下: : [[File:设计模式:抽象工厂模式:示例.png|600px]] 其代码如下: # 抽象工厂类: #: <syntaxhighlight lang="java" highlight=""> public abstract class AbstractFactory { public abstract Color getColor(String color); public abstract Shape getShape(String shape) ; } </syntaxhighlight> # 工厂类: #: <syntaxhighlight lang="java" highlight=""> public class ShapeFactory extends AbstractFactory { @Override public 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; } @Override public Color getColor(String color) { return null; } } </syntaxhighlight> #: <syntaxhighlight lang="java" highlight=""> public class ColorFactory extends AbstractFactory { @Override public Shape getShape(String shapeType){ return null; } @Override public 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; } } </syntaxhighlight> # 抽象产品类: #: <syntaxhighlight lang="java" highlight=""> public interface Shape { void draw(); } </syntaxhighlight> #: <syntaxhighlight lang="java" highlight=""> public interface Color { void fill(); } </syntaxhighlight> # 产品类: #: <syntaxhighlight lang="java" highlight=""> public class Rectangle implements Shape { @Override public void draw() { System.out.println("Inside Rectangle::draw() method."); } } </syntaxhighlight> #: <syntaxhighlight lang="java" highlight=""> public class Square implements Shape { @Override public void draw() { System.out.println("Inside Square::draw() method."); } } </syntaxhighlight> #: <syntaxhighlight lang="java" highlight=""> public class Circle implements Shape { @Override public void draw() { System.out.println("Inside Circle::draw() method."); } } </syntaxhighlight> #: <syntaxhighlight lang="java" highlight=""> public class Red implements Color { @Override public void fill() { System.out.println("Inside Red::fill() method."); } } </syntaxhighlight> #: <syntaxhighlight lang="java" highlight=""> public class Green implements Color { @Override public void fill() { System.out.println("Inside Green::fill() method."); } } </syntaxhighlight> #: <syntaxhighlight lang="java" highlight=""> public class Blue implements Color { @Override public void fill() { System.out.println("Inside Blue::fill() method."); } } </syntaxhighlight> # 工厂创造器/生成器类: #: <syntaxhighlight lang="java" highlight=""> 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; } } </syntaxhighlight> # 测试类: #: <syntaxhighlight lang="java" highlight=""> 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(); } } </syntaxhighlight> #: 结果输出: #: <syntaxhighlight lang="java" highlight=""> Inside Circle::draw() method. Inside Rectangle::draw() method. Inside Square::draw() method. Inside Red::fill() method. Inside Green::fill() method. Inside Blue::fill() method. </syntaxhighlight>
返回至“
设计模式:抽象工厂模式
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
笔记
服务器
数据库
后端
前端
工具
《To do list》
日常
阅读
电影
摄影
其他
Software
Windows
WIKIOE
所有分类
所有页面
侧边栏
站点日志
工具
链入页面
相关更改
特殊页面
页面信息