Java常用设计模式-Factory工厂模式
概念
工厂模式是Java常用的设计模式之一,提供了创建对象的一种方式,创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
为什么要使用工厂模式
当我们需要创建多个对象,而且多个对象所拥有的方法都相同,只是具体的实现有些不同,那么这个时候可以直接创建一个接口让所有的子类去实现,然后都统一交给工厂类进行管理创建,开发人员只需要记住一个名字就可以获得对应的对象,而无需关心内部的创建逻辑,还有就是一个对象创建、实例化的过程比较复杂,需要比较多的代码,并且还会在很多地方使用的时候,就会产生很多的重复代码,那么就可以把这个对象的创建交给工厂类去统一管理创建,这样既减少了代码,又方便了后期的修改和维护,后期如果需要修改的话,只需要在工厂类里修改一次就可以了,而不是把用到的地方都修改一次,工厂模式的存在也是为了方便代码的解耦,将对象的创建和对象的使用分开,也就是说当一个类调用另一个类的方法时,不需要去关心这个类对象怎么创建,而是直接使用它的方法就可以了,比如说我的数据库连接,可能一个工厂类里面包含了多种数据库的连接对象,他们的密码、用户名和连接方式都各不相同,那么我在使用这个对象的时候,不需要再去关心用户、密码连接方式这些创建细节,而是只需要通过一个名字去工厂类里获取我自己需要用到的连接对象即可。代码间的耦合度降低,后期维护修改也方便。
工厂模式的优缺点
优点:
- 一个调用者想创建一个对象,只要知道其名称就可以了。
- 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
- 屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:
- 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
使用方法
//以获取链接对象为例
//创建统一接口
public interface DataBaseConnect {
Object backConnection();
}
//Mysql连接类
public class MySQLConnect implements DataBaseConnect {
@Override
public Object backConnection() {
//省略连接代码
return "返回mysql连接对象";
}
}
//SQL server连接类
public class SqlServerConnect implements DataBaseConnect {
@Override
public Object backConnection() {
//省略连接细节
return "返回SqlServer连接对象";
}
}
//工厂类
public class ConnectFactory {
public static DataBaseConnect getConnect(String type){
if (type==null||type.equals("")){
throw new RuntimeException("连接类型不能为空");
}
if(type.equals("MYSQL")){
return new MySQLConnect();
}else{
return new SqlServerConnect();
}
}
}
//测试类
public static void main(String[] args) {
DataBaseConnect connect=ConnectFactory.getConnect("MYSQL");
System.out.println( connect.backConnection());
}
工厂模式在JDK源码中的应用
比如说java.net包下的抽象类URLStreamHandler,是所有流协议处理程序的通用基类。 流协议处理程序知道如何为特定协议类型建立连接,例如http或https 。URLStreamHandler子类的实例不是由应用程序直接创建的。而是由实现URLStreamHandlerFactory工厂类接口的类去进行管理创建的。