设计模式之抽象工厂模式,多个工厂类的抽象混合版

抽象工厂模式

AbstractFactory就是把多个XxxFactory混合到一块的升级版

组合不同产品族里的产品,并在FactoryProduct工厂生成器类里通过getFactory方法引入AbstractFactory类,再调用抽象工厂类里相关的产品族多态生成产品实例.最终调用相关方法.

被继承
定义get产品族metod
定义getFactory方法
定义产品族接口
实现具体类
定义抽象工厂
具体产品族工厂
反射生成具体产品的实体
定义工厂生产器
根据输入字符信息返回对应的具体产品族工厂的实体
具体工厂生产器
带main的Demo执行类
先用工厂生成器生成具体工厂
再用反射生成具体产品的实例
再用反射生成具体产品
最后使用实例的方法.

完整的应用步骤

  1. 创建形状接口
public interface Shape {
   void draw();
}
  1. 实现具体形状类
public class Rectangle implements Shape {
 
   @Override
   public void draw() {
      System.out.println("Inside Rectangle::draw() method.");
   }
}

public class Square implements Shape {
 
   @Override
   public void draw() {
      System.out.println("Inside Square::draw() method.");
   }
}

public class Circle implements Shape {
 
   @Override
   public void draw() {
      System.out.println("Inside Circle::draw() method.");
   }
}
  1. 创建颜色接口
public interface Color {
   void fill();
}
  1. 创建颜色接口实现类
public class Red implements Color {
 
   @Override
   public void fill() {
      System.out.println("Inside Red::fill() method.");
   }
}

public class Green implements Color {
 
   @Override
   public void fill() {
      System.out.println("Inside Green::fill() method.");
   }
}

public class Blue implements Color {
 
   @Override
   public void fill() {
      System.out.println("Inside Blue::fill() method.");
   }
}
  1. 创建混合抽象工厂类
public abstract class AbstractFactory{
    public abstract Shape getShape();
    public abstract Color getColor();
}
  1. 创建具体工厂类
public class ShapeFactory extends AbstractFactory{
    @Override
    public Shape getShape(Class<? extends Shape> clazz){
        try{
            return (Shape)Class.forName(clazz.getName()).newInstance();
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        } 
    }
    @Override
    public Color getColor(){ 
        return null; //必须实现父类的全部抽象方法,剩一个也不行,否则子类不就变成抽象类了?
    }
}

public class ShapeFactory extends AbstractFactory{
    @Override
    public Shape getShape(){
        return null;
    }
    @Override
    public Color getColor(Class<? extends Color> clazz){ 
        try{
            return (Color)Class.forName(clazz.getName()).newInstance();
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        } 
    }
}

创建工厂生产器

反射获取具体工厂的实例

public class FactoryProduct{
    public AbstractFactory getFactory(Class<? extends AbstractFactory> clazz){
        try{
            return Class.forName(clazz.getName()).newInstance();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

创建Demo使用类

为了方便外人使用反射,可以在Shape接口,Color接口,AbstractFactory抽象类里分别定义字符串常量:如 static String CIRCLE = “Circle.class”; static String SHAPEFACTORY = “ShapeFactory.class”

public class AbstractFactoryPatternDemo{
    public static void main(String[] args){
    
        AbstractoryFactory factory_1 = FactoryProduct.getFactory(AbstractFactory.SHAPEFACTORY);//创建Shape工厂
        
        Shape shape_1 = ShapeFactory.getShape(Shape.CIRCLE);//创建Circle实例
        shape_1.draw();//使用Circle实例的画图方法画圆
        
        Shape shape_2 = ShapeFactory.getShape(Shape.SQUARE);//创建Circle实例
        shape_2.draw();//使用Circle实例的画图方法画圆
        
        Shape shape_3 = ShapeFactory.getShape(Shape.RECTANGLE);//创建Circle实例
        shape_3.draw();//使用Circle实例的画图方法画圆
        
        AbstractoryFactory factory_2 = FactoryProduct.getFactory(AbstractFactory.COLORFACTORY); //创建Color工厂
        
        Color shape_4 = ColorFactory.getShape(Color.RED);//创建Color实例
        shape_4.fill();//使用Color实例的填充方法填色
        
        Color shape_5 = ColorFactory.getShape(Color.BLUE);//创建Color实例
        shape_5.fill();//使用Color实例的填充方法填色
        
        Color shape_6 = ColorFactory.getShape(Color.GREEN);//创建Color实例
        shape_6.fill();//使用Color实例的填充方法填色
    }
}

你可能感兴趣的:(Java)