动机:传统创建对象必须用new的方式,为了解决new带来的紧耦合
缺点:每个create方法返回对象都必须参数相同,因为他们都继承了SpilitterFactory基类
class Splitter{
void split();
}
class FileSplitter extends Splitter{
@Override
void split(){
//...
}
}
class TxtSplitter extends Splitter{
@Override
void split(){
//...
}
}
class PictureSplitter extends Splitter{
@Override
void split(){
//...
}
}
class Test{
public static void main(String [] args){
String filePath=...;
Splitter sp=new FileSplitter(filePath);//违背依赖倒置原则,因为编译的时候,必须存在FileSplitter类
sp.split();
}
}
这里需要改变new所带来的紧耦合,用些“方法”得到目标对象的实例,就像new一样
class Splitter{
void split();
}
class SplitterFactory{
Splitter createInstance(...);
}
class FileSplitterFactory extends SplitterFactory{
@Override
Splitter createInstance(...){
return new FileSplitter(...);
}
}
class Test{
SplitterFactory splitterFactory;
public Test(SplitterFactory splitterFactory){
this.splitterFactory=splitterFactory;
}
public static void main(String [] args){
String filePath=...;
Splitter sp=splitterFactory.createInstance(filePath);//这里虽然没有了编译时绑定,而将所谓的编译时绑定交给了调用该方法构造器的类,也就是让他new
sp.split();
}
}
这种方法虽然看似当前Test类没有了编译时依赖,但是调用构造器的类还是需要new一个具体的工厂,这里只是将new(编译时依赖)尽量局限到一个地方而已