设计模式(二)抽象工厂模式
就是围绕一个超级工厂创建其他工厂,个人的理解就是工厂模式多了几个维度
使用范围:系统的产品超过一个产品族,而系统只消费某一族的产品
例子:服装会有商务装,时尚装;商务装下面也会有一系列的产品分类 每次我们只是取其中的一件衣服
一:为形状创建一个接口
shape.java
public interface Shape { void draw(); }二:对应的实现shape接口的实体类(多个)
Rectangle.java
public class Rectangle implements Shape { @Override public void draw() { System.out.println("Inside Rectangle::draw() method."); } }
三:为颜色创建另一个接口类
Color.java
public interface Color { void fill(); }四:对应的实现color接口的实体类(多个)
public class Red implements Color { @Override public void fill() { System.out.println("Inside Red::fill() method."); } }五:为color和shape创建抽象类来获取工厂
AbstractFactory.java
public abstract class AbstractFactory { abstract Color getColor(String color); abstract Shape getShape(String shape) ; }六:继承币实现,创建扩展了AbstractFactory的工厂类,机与给定信息生成实体类的对象,对应的只实现自己工厂类的方法
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; } @Override Color getColor(String color) { 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; } }
八:使用 FactoryProducer 来获取 AbstractFactory,通过传递类型信息来获取实体类的对象
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(); } }