抽象工厂设计模式
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
如何解决:在一个产品族里面,定义多个产品。
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
附上图,便于理解,图来自菜鸟教程
形状接口
//形状接口 public interface Shape { void draw(); }
//矩形类
class Rectangle implements Shape { @Override public void draw() { System.out.println("矩形"); } }
//正方形类
class Square implements Shape { @Override public void draw() { System.out.println("正方形"); } }
//圆类
class Circle implements Shape { @Override public void draw() { System.out.println("圆"); } }
//颜色接口
interface Color { void fill(); }
//红色类
class Red implements Color { @Override public void fill() { System.out.println("红色"); } }
//绿色类
class Green implements Color { @Override public void fill() { System.out.println("绿色"); } }
//为Color和Shape对象创建抽象类来获取工厂。
abstract class AbstractCreateFactory{ public abstract Color getColor(String color); public abstract Shape getShape(String shape) ; }
//得到形状和颜色的工厂类
//得到形状和颜色的工厂类 class CreateFactory extends AbstractCreateFactory{ @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(); } return null; } @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; } }
//创建一个生成器
class FactoryProducer{ public static AbstractCreateFactory getFactory(){ return new CreateFactory(); } }
//测试类
class Test1{ public static void main(String[] args) { Shape circle = FactoryProducer.getFactory().getShape("CIRCLE"); circle.draw(); Color red = FactoryProducer.getFactory().getColor("RED"); red.fill(); } }