博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么要使用工厂模式
阅读量:2239 次
发布时间:2019-05-09

本文共 2256 字,大约阅读时间需要 7 分钟。

工厂的作用相当于帮助我们完成实例化的操作。

优势1:一般在代码中,实例化一个类A是直接new A(),假如类A是一个完全独立的类,没有相似类,则没有必要使用工厂模式,直接new A()没有毛病。但是如果类A本身有一个相似类B,而在实际使用类A或者类B的实例时,如果关心的是类A与类B的共同部分,则工厂模式就可以体现出它的优势。

比如调用数据库,所有的数据库都有插入操作insert:

interface DatabaseOperate{

    public void insert(Mydata data){
    }
}

然而,不同的数据库的具体实现方法是不同的

class MySQLOperate implements DatabaseOperate{
    @Override
    public void insert(Mydata data){
        ...
    }
}
class OracleOperate implements DatabaseOperate{
    @Override
    public void insert(Mydata data){
        ...
    }
}
然而真正使用插入操作的时候,我们需要关心的并不是插入操作如何具体实现,我们只需要对数据库进行插入操作就行了,所以使用工厂类对具体实现方法进行整合

class MyDBFactory{

    
    public static int MySQL=1;
    public static int Oracle=2;
    public static int DBType = MySQL;
    public static DatabaseOperate getDatabase(){
        if(DBType=MySQL){
            return new MySQLOperate();
        }
        
        if(DBType=Oracle){
            return new OracleOperate();
        }
    }
}
这样我们在调用的时候就可以忽略具体实现方法,而直接进行调用。
void insert(Mydata data){
    DatabaseOperate operate = MyDBFactory.getDatabase();
    operate.insert(data);
}
在这里,工厂模式相当于实现了下面的代码。
class MySQLOperate{
    public void insert(Mydata data){
        ...
    }
}
void inert(Mydata data){
    MySQLOperate opertate = new MySQLOperate();
    operate.insert(data);
}
如果这样编写,在进行数据库切换时,需要重新写insert()方法,尤其是在很多地方用到与insert()方法相同的操作时,要在很多地方new MySQLOperate这个类,修改起来跟家麻烦。
这个优势有两个应用场景:

一个是上述的例子,可以动态的使用代码,只需要修改部分配置。

还有一个是在一个大类需要很多小类的时候,每种小类负责完成一部分工作,但是有不同的完成方法,大类只需要设置条件,工厂自动返回合适的小类。

优势2:初始化封装。在需求一个类的实例时,假如需要一个相同属性的实例,每次初始化的操作是一样的,用工厂模式可以对初始化进行封装,简化操作。

比如有一个类Car

class Car{

    private String brand;
    private double price;
    public Car(String brand,double price){
        this.brand=brand;
            this.price=price;    
    }
}

我们在实例化一个Audi的时候,赋值brand为Audi,price为30000

void createCar(){

    Car car1 = new Car("Audi",300000);
    Car car2 = new Car("Audi",300000);
}
每次要用到Audi这个实例的时候,都要给定两个初始化参数,"Audi"和30000,然而如果确定了brand为Audi的话,price随之确定为300000,每次实例化的时候要输入多个( 这里是两个)参数,会显得很麻烦。
所以我们这里使用工厂模式

public CarFactory

{

    private Map<String,Car> cars = new HashMap<>();
 
    static

   {

        cars.put("Audi",new Car("Audi",300000));
    }
    
    public static Car getCar(String name)

   {

        return cars.get(name);
    }
 
}
然后我们在实例化Audi时,只需要输入他的名称就可以得到参数完整的Audi

void createCar(){
    Car car1 = CarFactory.getCar("Audi");
    Car car2 = CarFactory.getCar("Audi");
}
这样大大简化了实例化时的初始化设置。

--------------------- 
作者:zinsserzc 
来源:CSDN 
原文:https://blog.csdn.net/qq_28859325/article/details/60580578 
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的文章
spring的注解开发中的常用注解(一)------@bean @Configuration @ComponentScan @Import @Scope @Lazy
查看>>
(五)alin’s mysql学习笔记----索引性能分析
查看>>
Spring中使用@Transactional注解进行事务管理的时候只有应用到 public 方法才有效
查看>>
springboot整合rabbitmq及rabbitmq的简单入门
查看>>
mysql事务和隔离级别笔记
查看>>
事务的传播属性(有坑点)自调用失效学习笔记
查看>>
REDIS缓存穿透,缓存击穿,缓存雪崩原因+解决方案
查看>>
动态代理实现AOP
查看>>
23种常见的java设计模式
查看>>
关于被final修饰的基本数据类型一些注意事项
查看>>
java Thread中,run方法和start方法的区别
查看>>
在 XML 中有 5 个预定义的实体引用
查看>>
XML 元素是可扩展的
查看>>
避免 XML 属性?针对元数据的 XML 属性
查看>>
XML DOM nodeType 属性值代表的意思
查看>>
JSP相关知识
查看>>
JDBC的基本知识
查看>>
《Head first设计模式》学习笔记 - 适配器模式
查看>>
《Head first设计模式》学习笔记 - 单件模式
查看>>
《Head first设计模式》学习笔记 - 工厂方法模式
查看>>