简单工厂模式

思考简单工厂

接口的本质就是不想让用户看到具体实现,而直接使用多态new对象,用户就能知道接口的实现类是哪个,所以使用简单工厂,对外提供一个方法,具体调用哪个实现类用户就看不到了

1.简单工厂模式的本质

简单工厂的本质是:选择实现

注意简单工厂的重点在选择,实现是已经做好了的。就算实现再简单,也要由具体的实现类来实现,而不是在简单工厂里面来实现。简单工厂的目的在于为客户端来选择相应的实现,从而使得客户端和实现之间解耦。这样—来,具体实现发生了变化,就不用变动客户端了,这个变化会被简单工厂吸收和屏蔽掉。
实现简单工厂的难点就在于“如何选择”实现,前面讲到了几种传递参数的方法,那都是静态的参数,还可以实现成为动态的参数。比如,在运行期间,由工厂去读取某个内存的值,或者是去读取数据库中的值,然后根据这个值来选择具体的实现等。

2.何时选用简单工厂模式

建议在以下情况中选用简单工厂。

  • 如果想要完全封装隔离具体实现,让外部只能通过接口来操作封装体,那么可以选用简单工厂,让客户端通过工厂来获取相应的接口,而无须关心具体的实现。

  • 如果想要把对外创建对象的职责集中管理和控制,可以选用简单工厂,—个简单工厂可以创建很多的、不相关的对象,可以把对外创建对象的职责集中到一个简单工厂来,从而实现集中管理和控制。

3.优缺点

简单工厂有以下优点

  • 帮助封装
    简单工厂虽然很简单,但是非常友好地帮助我们实现了组件的封装,然后让组件外部能真正面向接口编程。

  • 解耦
    通过简单工厂,实现了客户端和具体实现类的解耦。
    如同上面的例子,客户端根本就不知道具体是由谁来实现,也不知道具体是如何实现的,客户端只是通过工厂获取它需要的接口对象。

简单工厂有以下缺点

  • 可能增加客户端的复杂度
    如果通过客户端的参数来选择具体的实现类,那么就必须让客户端能理解各个参数所代表的具体功能和含义,这样会增加客户端使用的难度,也部分暴露了内部实现,这种情况可以选用可配置的方式来实现。

  • 不方便扩展子工厂
    私有化简单工厂的构造方法,使用静态方法来创建接口,也就不能通过写简单工厂类的子类来改变创建接口的方法的行为了。不过,通常情况下是不需要为简单工厂创建子类的。

4.简单工厂模式的结构

在这里插入图片描述

5.实现

public interface Api {

    void test();
}

public class Impl1 implements Api{

    @Override
    public void test() {
        System.out.println("1111111111111111111");
    }
}

public class Impl2 implements Api{

    @Override
    public void test() {
        System.out.println("22222222222222222");
    }
}

工厂类

public class ApiFactory {

    public static Api createApi(int param){
        Api api=null;
        if (1==param){
            api=new Impl1();
        }else if (2==param){
            api=new Impl2();
        }
        return api;
    }
}

测试类

public class Client {

    public static void main(String[] args) {
        Api api = ApiFactory.createApi(2);
        api.test();
    }
}

类图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值