首先声明一下工厂模式的原理和用于何种情况。
意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
何时使用:我们明确地计划不同条件下创建不同的实例时。
如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
首先创建一个公式的接口。
public interface DesignFormulas { //获取买卖信号的信息,用map集合接收 public Map<String, List<StockDataVo>> getBuySellSignal(); }
在来创建这个公式的实现类
public class EMA implements DesignFormulas { public Map<String, List<StockDataVo>> getBuySellSignal() { System.out.println("这里是EMA方法"); return null; } }
public class SMA implements DesignFormulas { public Map<String, List<StockDataVo>> getBuySellSignal() { System.out.println("这里是SMA方法"); return null; } }
然后在来创建一个工厂 在菜鸟教程里用的是简单的if判断,代码如下
public class ShapeFactory { //使用 getShape 方法获取形状类型的对象 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; } }
虽然类名方法名 都不一样 但是简单的可以看出 他是通过传递一个String类型的字符串来判断调用那一个方法,但是由此可以得出 ,在后期进行拓展 或者维护管理的时候 会非常麻烦和复杂
所以我又找到了一个更加方便的方法 代码如下:
public <T> T getForsignal(Class<?extends T> clazz){ //<T> 表明了 这是一个T 类型的方法。 //T表明了 返回T类型 //(Class)定义了参数类型为任何Class // (Class<?extends T>)设置了 参数类型必须和这个T有继承关系 T obj=null; try {
//obj=Class.forName(clazz.getName()).newInstance(); //用这个方法也可以 但是后面调用的时候需要强制转换 //意思是根据Class的名字来创建的一个对象 类似于New方法
obj=clazz.getDeclaredConstructor().newInstance(); //与上面同理 } catch (ReflectiveOperationException e) { e.printStackTrace(); } return obj; }
现在写一个min方法来调用这些
public class Controlle { public static void main(String[] args) { //Administrator administrator= new Administrator();
//EMA ema=(EMA)administrator.getForsignal(EMA.class);
//ema.getBuySellSignal();
//如果使用上面注释哪一种 就是这样实现 只是要转型罢了;
Administrator administrator= new Administrator(); EMA ema=administrator.getForsignal(EMA.class); ema.getBuySellSignal(); SMA sma=administrator.getForsignal(SMA.class); sma.getBuySellSignal(); } }
现在附上学习参考资料 https://www.cnblogs.com/tianSky/p/6070565.html; 下期会试着把工厂模式应用到正在写的项目当中
Class.forName(clazz.getName()).newInstance();