设计模式学习笔记--抽象工厂模式
2016-11-21 20:21
357 查看
二、抽象工厂模式
介绍
抽象工厂模式(Abstract Factory Pattern)是一个特殊的工厂,它是用于创建其他工厂的工厂,又称超级工厂。属于创建型模式,接口是负责创建一个相关对象的工厂,不需要显式制定类,其对象便又是一个工厂。提供一个创建一些列相关或相互依赖对象的接口,无需指定具体的类。
解决接口选择的问题,用于系统产品有多个产品族,而系统只消费其中某一族产品的情况。在一个产品族内定义多个产品。
优缺点
优点在于一个产品族中多个对象被设计成一起工作时,能够保诚客户端始终只使用同一个产品族中的对象。
缺点在于产品族扩展困困难,新增产品系列就要在抽象类、具体类中都要修改。
QQ换皮肤的情形类似这种设计。产品族难扩展,而产品等级易扩展。
实现
创建Shape和Color接口、以及实现两接口的实现类。创建抽象工厂Abstract Factory。定义工厂类ShapeFactory和ColorFactory,都是继承自AbstractFactory的,然后在创建一个工厂创造器FactoryProducer。在Abstract FactoryPatternDemo中演示使用Factory Producer获取Abstract Factory对象,并向其传递shape和color参数,来获取具体对象。
定义接口
Shape.java
public interface Shape { void draw(); }
color.java
public interface Color { void fill(); }
实现接口
Shape的implement实现类
Rectangle.java
public class Rectangle implements Shape { @Override public void draw() { System.out.println("Inside Rectangle::draw() method."); } }
Square.java
public class Square implements Shape { @Override public void draw() { System.out.println("Inside Square::draw() method."); } }
Circle.java
public class Circle implements Shape { @Override public void draw() { System.out.println("Inside Circle::draw() method."); } }
Color的implement实现类
Red.java
public class Red implements Color { @override public void fill(){ System.out.println("Inside Red::fill() method."); } }
Green.java
public class Green implements Color { @override public void fill(){ System.out.println("Inside Green::fill() method."); } }
Blue.java
public class Blue implements Color { @override public void fill(){ System.out.println("Inside Blue::fill() method."); } }
创建抽象工厂类
AbstractFactory.java
public abstract class AbstractFactory { abstract Color getColor(String color); abstract Shape getShape(String shape); }
创建具体工厂类
ShapeFactory.java
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; } //因为是ShapeFactory,虽然实现AbstractFactory,必须实现它的两个抽象方法,但是geColor在此处没有实现的意义。 @Override Color getColor(String color) { return null; } }
ColorFactory.java
public class ColorFactory extends AbstractFactory { //因为是ColorFactory,虽然实现AbstractFactory,必须实现它的两个抽象方法,但是geShape在此处没有实现的意义。 @Override public Shape getShape(String shapeType){ return null; } @Override 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; } }
创建工厂生成器
FactoryProducer.java
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; } }
演示使用
AbstractFactoryPatternDemo.java
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(); } }
输出结果
Inside Circle::draw() method. Inside Rectangle::draw() method. Inside Square::draw() method. Inside Red::fill() method. Inside Green::fill() method. Inside Blue::fill() method.
相关文章推荐
- 设计模式学习笔记(三)——Abstract Factory抽象工厂模式
- 设计模式学习笔记(三)——Abstract Factory抽象工厂模式
- 设计模式 学习笔记(7) 抽象工厂模式、状态模式
- 设计模式学习笔记(3) - 抽象工厂模式
- 设计模式学习笔记-抽象工厂模式
- 设计模式学习笔记五:抽象工厂模式
- 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)
- 设计模式学习笔记(一)——抽象工厂模式
- 设计模式学习笔记-抽象工厂模式
- 【设计模式】学习笔记6:抽象工厂模式(Abstract Factory)
- 设计模式学习笔记(三)——Abstract Factory抽象工厂模式
- .Net设计模式学习笔记(三):抽象工厂模式(Abstract Factory)
- 设计模式学习笔记(三)——Abstract Factory抽象工厂模式
- 设计模式学习笔记--Abstract Factory抽象工厂模式
- 设计模式学习笔记(五)—Abstract Factory抽象工厂模式
- 设计模式学习笔记——抽象工厂模式
- 设计模式学习笔记-抽象工厂模式
- java 设计模式 学习笔记(3) 抽象工厂模式
- 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)
- 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)