框架:能完成一定功能的半成品,通常完成的功能是基础的,有难度的,通用的。
面向对象是开发人员,而不是最终用户。
工厂方法:
主要功能是在父类不知道具体实现的情况下完成功能调用(该父类一定是抽象类,完成调用的方法一定是抽象方法),而具体的实现延迟到子类来实现。
工厂方法本意是由Creator中其他方法使用工厂方法创建的对象,一般情况下工厂方法不被Creator外部使用。
(感觉设计模式就是将原来简单直接的使用方式,多加了几层绕了几个弯,搞得更复杂了而已,目前还没体会到有什么好处)
client使用Creator一般有2种情况:使用Creator对象,使用Creator创建的对象
IoC Inversion of Control 控制反转
DI Dependency Injection 依赖注入
程序(也可以是一个对象)、外部资源、IoC/DI 容器
从程序的角度出发,它需要依赖容器给其注入外部资源。
从容器的角度出发,它控制资源的创建,然后将其反注入到应用程序中。
IoC/DI是种思想,将应用程序和所需的资源分离,提高了灵活性。
工厂方法的本质是延迟到子类来选择实现。
简单工厂是的“选择实现”在工厂类中直接完成,工厂方法的“选择实现”是在其子类中完成。
如果工厂方法类中只提供工厂方法,并且工厂方法有默认实现,那就是简单工厂了。
依赖倒置原则
低层依赖高层,不论低层还是高层,都依赖抽象。
应用场景:1)当需要创建某个接口的对象,而又不知道具体实现时 2)如果一个类本身就需要由它的子类来创建所需的对象时。
示例代码
public class Factory_Method {
public static void main(String[] args) {
Creator c1 = new ImplCreator1();
Creator c2 = new ImplCreator2();
c1.work("test data");
c2.work("test data");
}
}
interface Product {
void work(String s);
}
class ImplProduct1 implements Product{
@Override
public void work(String s) {
// TODO Auto-generated method stub
System.out.println(s+" finish in ImplProduct1");
}
}
class ImplProduct2 implements Product{
@Override
public void work(String s) {
// TODO Auto-generated method stub
System.out.println(s+" finish in ImplProduct2");
}
}
abstract class Creator{
abstract Product factoryMethod();
void work(String s){
Product p = factoryMethod();
p.work(s);
}
}
class ImplCreator1 extends Creator{
@Override
Product factoryMethod() {
// TODO Auto-generated method stub
return new ImplProduct1();
}
}
class ImplCreator2 extends Creator{
@Override
Product factoryMethod() {
// TODO Auto-generated method stub
return new ImplProduct2();
}
}