抽象工厂模式

来源:互联网 发布:淘宝怎么买图片空间 编辑:程序博客网 时间:2024/06/07 00:08

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显示指定他们的类。每个生成的工厂都能按照工厂模式提供对象

介绍
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类
主要解决:主要解决接口选择的问题
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品
如何解决:在一个产品族里面,定义多个产品
关键代码:在一个工厂里聚和多个同类产品

优点:当一个产品族中的多个对象被设计成一起工作时,他能保证客户端始终只能使用同一个产品族中的对象

缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的Creator里增加代码,又要在具体的里面加代码

实现步骤

1.创建一个shape、Color接口

public interface Shape {public void Draw();}
public interface Color {public void Fill();}

2.创建实现接口的实体类

public class Circle implements Shape{@Overridepublic void Draw() {System.out.println("draw a circle");}}
public class Line implements Shape{@Overridepublic void Draw() {System.out.println("draw a line");}}

public class Orange implements Color{@Overridepublic void Fill() {System.out.println("fill orange color!");}}

3.创建抽象类来获取工厂
public abstract class AbstractFactory {abstract Shape getShape(String shapeType);abstract Color getColor(String colorType);}
4.创建扩展了抽象类,基于给定信息创建实体
public class ShapeFactory extends AbstractFactory{@OverrideShape getShape(String shapeType) {if(shapeType==null){return null;}else if("circle".equalsIgnoreCase(shapeType)){return new Circle();}else if("line".equalsIgnoreCase(shapeType)){return new Line();}return null;}@OverrideColor getColor(String colorType) {// TODO Auto-generated method stubreturn null;}}

public class ColorFactory extends AbstractFactory{@OverrideShape getShape(String shapeType) {// TODO Auto-generated method stubreturn null;}@OverrideColor getColor(String colorType) {if(colorType==null){return null;}if("orange".equalsIgnoreCase(colorType)){return new Orange();}return null;}}
5.创建工厂制作类
public class FactoryProducer {static AbstractFactory getFactory(String choice){if("shape".equalsIgnoreCase(choice)){return new ShapeFactory();}else if("color".equalsIgnoreCase(choice)){return new ColorFactory();}return null;}}
6.测试
public class AbstractFactoryTest {public static void main(String[] args) {// TODO Auto-generated method stubAbstractFactory abstractFactory=FactoryProducer.getFactory("shape");Shape circle=abstractFactory.getShape("circle");Shape line=abstractFactory.getShape("line");circle.Draw();line.Draw();}}
7.结果

draw a circledraw a line





0 0