工厂
场景和问题:Java程序开发讲究面向接口编程,隐藏具体的实现类,可是如何得到接口呢?
工厂类的命名规范:***Factory
单例工厂方法的命名规范:getInstance()
工厂的本质是“选择实现”
铁三角:1接口:封装实现类中的方法
2实现类:真正的实现代码
3工厂类:选择实现
工厂、接口和实现类之间的技术边界:工厂只负责选择实现,实现类才做真正的实现,而接口是限定到底实现什么东西和返回什么东西,三者之间分工明确、各负其责。
下面是一个在工厂类中通过配置文件(配置文件可以去看前面的博客点击打开链接)来选择实现类的程序:
Client类(main类):
package cn.hncu.pattern.Factory;
import cn.hncu.pattern.Factory.dep.DepApi;
import cn.hncu.pattern.Factory.dep.DepFactory;
/**
* @author 军街
*客户界面
*/
public class Client {
public static void main(String[] args) {
DepApi api=DepFactory.getInstance();//利用工厂类返回一个接口DepApi的具体实现类
api.t1();//调用接口里的方法,功能在实现类中实现。
}
}
接口Api类:
package cn.hncu.pattern.Factory.dep;
public interface DepApi {//DepApi接口,封装实现类中的方法。只可以使用接口中的抽象方法。
public abstract String t1();//具体功能在实现类中。
}
实现类DepImp1:
package cn.hncu.pattern.Factory.dep;
public class DepImp1 implements DepApi{//接口DepApi的实现类
@Override
public String t1() {//实现接口的具体功能。
System.out.println("我是DepApi的实现类哦QWQ");
return "OK";
}
}
实现类DepImp2:
package cn.hncu.pattern.Factory.dep;
public class DepImp2 implements DepApi{
@Override
public String t1() {
System.out.println("我也是接口DepApi的实现类,但是我是第2个版本的");
return "OK";
}
}
工厂类DepFactory:
package cn.hncu.pattern.Factory.dep;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
public class DepFactory {
public static DepApi getInstance(){//工厂方法,返回一个实现DepApi的实现类
Properties p=new Properties();
int n = 0;
try {
FileInputStream inStream=new FileInputStream("a.properties");
p.load(inStream);
String strType= p.getProperty("type");
n=Integer.parseInt(strType);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(n==1){
return new DepImp1();
}else if(n==2){
return new DepImp2();
}else{
return null;
}
}
}