最近在学习java的设计模式,边学边自己解决一些想到的问题,然后自己动手验证、查资料、冥想解决,里面肯定有很多不足之处。欢迎各位各种拍砖!
这里不再累述java工程模式的原理和实现或是概念,这里主要探讨java工程模式的必要性。(显然这个题有点大,肯定有很多人不认同我的观点。)
我觉得工厂模式的作用就是为获取统一的接口提供了一个比较可以理解的形式,如果是纯粹获取一个类的话,就有点画蛇添足了——直接用面向对象的多态就可以解决,而且更简单明了。
代码附上:
package com.fqs.test.factory;
public interface Show {
void showTv();
}
package com.fqs.test.factory;
public class TCLTv implements Show {
@Override
public void showTv() {
System.out.println("This is TCL TV !");
}
}
package com.fqs.test.factory;
public class ChanghongTv implements Show {
@Override
public void showTv() {
System.out.println("This is Changhong TV !");
}
}
工厂:
package com.fqs.test.factory;
public interface Factory {
public Show getShow();
}
特定工厂:
package com.fqs.test.factory;
public class TCLFactory implements Factory {
@Override
public Show getShow() {
return new TCLTv();
}
}
package com.fqs.test.factory;
public class ChangHongFactory implements Factory {
@Override
public Show getShow() {
return new ChanghongTv();
}
}
测试:
package com.fqs.test.factory;
public class Test {
public static void main(String[] args) {
// //一般的工厂方法:
// Factory TCLFc = new TCLFactory();
// Factory CHFc = new ChangHongFactory();
// TCLFc.getShow().showTv(); //This is TCL TV !
// CHFc.getShow().showTv(); //This is Changhong TV !
// //采用接口实例的方法替代
// Show TCLShow = new TCLTv();
// Show CHShow = new ChanghongTv();
// TCLShow.showTv(); //This is TCL TV !
// CHShow.showTv(); //This is Changhong TV !
}
}
从这里可以看出:
其实工厂方法可以用接口实例对象的方法替代(从编码上还简化了不少——不需要创建工厂类),但是这种表述和我们的认知似乎是有点不一样的:一个接口是一个方法的抽象,在现实生活中应该不可能存在这种对象的才对,当然在java里说的通——一切皆对象吗,哈哈。
如果摒弃我们的认知来谈,我觉得其实工厂方法没什么必要。
【注】经我测试发现,其实interface的implements和类的继承是一样的——就是任何implements了一个interface的类和其子类都可以作为这个interface的一个实例。这就是我提出用接口实例替代工厂方法的基础。
欢迎拍砖,一起讨论,共同进步!