首先声明一下工厂模式的原理和用于何种情况。
意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
何时使用:我们明确地计划不同条件下创建不同的实例时。
如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
下面让我们来看一下如何创建简单的工厂模式吧
首先创建一个公式的接口。
public interface DesignFormulas {
//获取买卖信号的信息,用map集合接收
public Map<String, List<StockDataVo>> getBuySellSignal();
}
在来创建这个公式的实现类
这是指标EMA
public class EMA implements DesignFormulas {
public Map<String, List<StockDataVo>> getBuySellSignal() {
System.out.println("这里是EMA方法");
return null;
}
}
这是指标SMA
public class SMA implements DesignFormulas {
public Map<String, List<StockDataVo>> getBuySellSignal() {
System.out.println("这里是SMA方法");
return null;
}
}
然后在来创建一个工厂 代码如下
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();
}
}
这是鄙人第一次在CSDN上发表博客,由于个人水平有限 可能代码非常辣眼睛,也会有些不明所以的注释,还望各位大神见谅,
后面我会逐一撰写其他设计模式,也希望看到这篇博客的人 多多提出意见,以便我后期改进,感激不尽!