设计模式学习之一简单工厂

2020-02-13

定义:

提供一个创建对象实例的功能,而无需关注其具体实现。被创建的实例类型可以是接口、抽象类,也可以是具体的类。

三个模块:

1. 需要被创建的类A

2. 工厂,提供创建 类A 的功能

3. 调用者,调用者通过 工厂 获得(而不是创建)A

package designpatterns.simplefactory;

public interface Human {
    void fuck();
}


package designpatterns.simplefactory;
public class Model1 {
    public static void main(String[] args){
        Human aboy = null;//一般情况下模块1中需要一个Human实例时需要自己去实现Human接口并且自己创建一个实例。
        //当Human功能增加时,需要修改模块1的实现

        //但是通过简单工厂模式,把Human的具体实现交给了模块2,对于模块1来说 需要实例就去问模块2(工厂)要一个。
        //有什么功能上的变化也只需要在模块2中修改其实现就可以了。
        aboy = Model2.getHuman();
        aboy.fuck();
    }
}


package designpatterns.simplefactory;

public class Model2 {
    public static Human getHuman(){
        return new HumanImpl();
    }
    
    public static class HumanImpl implements Human{
        @Override
        public void fuck() {
            System.out.println("fuck");
        }
    }
}

 

我的理解:

调用者(书中说是客户端)需用调用某种功能时,不用再自己创建具体实现了该功能的对象实例了,只需要创建一个接口,用工厂来创建一个该接口的具体实现类。就可以使用需要的功能了。实现了调用者(客户端)和具体实现类的解耦,如果一个接口多个实现类中的功能实现不一样(比如产生不同的结果,或不同的算法实现)就可以通过向 工厂传递参数来指定具体的实现类。

还有就是可以在配置文件中写上类信息,工厂过来再读取,那么就可以实现连工厂的代码都不用改了,每次需要啥新的类就直接在配置文件里写上。

tomcat加载那些类好像就是这样的方式吧。。。

 

坏处:

如果客户端可以通过传参数给工厂来选择不同的实现类,那客户端就得理解 各个参数的意义。如果不想通过参数就能用上不同的实现类就必须用 工厂配置文件这种形式了。

本质:

选择实现。

使客户端 和 确定的 实现类 解耦,不用实现类一发生变化就去修改客户端了(比如实现类所属包变化了啊啥的)

收获:

有了设计模式,就能体会到将程序分模块开发的乐趣和便利了。访问控制符提供的封装性保证了类#对象 作为构建程序的基本单元,设计模式帮助我们 组装、排列这些基本单元,让代码结构、系统架构更清晰。