JAVA 设计模式 之 工厂模式的简单仿写

首先声明一下工厂模式的原理和用于何种情况。

意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

何时使用:我们明确地计划不同条件下创建不同的实例时。

如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。

首先创建一个公式的接口。

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();

猜你喜欢

转载自www.cnblogs.com/czBoooook/p/9205624.html