工厂模式:我觉得工厂模式就是第三方模式。当客户端需要实现某些功能时,根据前面讲到的 依赖接口编程原则和不能依赖实现类编程。所以现在就出现一个问题,我需要调用实现类的功能,我又不能直接调用,那我怎么办? 只能通过第三方工厂模式来帮忙调用。那么接口是干什么的?我觉得接口就是用来说明 有那些功能你是可以实现的。当我们具体要用的时候就去找工厂方法。下面是代码实例
接口
public interface BookApi {
public abstract void t1();
}
实现类1
import cn.hncu.pattern.factory.book.BookApi;
public class BookImpl1 implements BookApi {
@Override
public void t1() {
System.out.println("图书模块的功能:book111111111111111");
}
}
实现类2
import cn.hncu.pattern.factory.book.BookApi;
public class BookImpl2 implements BookApi {
@Override
public void t1() {
System.out.println("修改后的图书模块功能222222222222");
}
}
工厂方法
import cn.hncu.pattern.factory.book.impl.BookImpl1;
import cn.hncu.pattern.factory.book.impl.BookImpl2;
//工厂的本质是:选择实现
public class BookApiFactory {
private BookApiFactory(){
}
//工厂方法----命名规范: getInstance, getBookApi, createBookApi
// public static BookApi getBookApi(){
// return new BookImpl2();
// }
//工厂方法--版本2
public static BookApi getBookApi( ){
int type = 2; //"从配置文件读取type值"
if(type==1){
return new BookImpl1();
}else if(type==2){
return new BookImpl2();
}else{//加入了原来没有的类
try {
Class c = Class.forName("通过配置文件获取类名");//通过dir.list()更活
return (BookApi) c.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
}
客户端调用代码
//当前模块只依赖了book模块的: 工厂+接口
public class Client {
public static void main(String[] args) {
//此处不能够依赖实现类,即实现类是隐藏的---因为实现类是封装在模块module内部隐藏,不对外开放
//解决办法: 通过工厂类得到接口
BookApi bookApi = BookApiFactory.getBookApi();
bookApi.t1();
}
}