工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式
共同特点
封装创建对象,它们将客户端与创建对象的具体过程分离。它的使用通常伴随着多态,如:
UserDao userDao = new UserDaoMysqlImpl();
UserDao userDao = Factory.getUserImpl(“mysql”);
这样就创建了一个userDao,其中连接的是mysql数据库。
第二种方法用的是工厂模式,它相较于第一种,能够隐藏“new”的过程。我们无法判断getUserImpl里面是否使用了new,我们只能知道能够获得一个与mysql有关的userDao。具体调用了哪个类的哪个方法,得到的是userDao还是userDao的子类,如果不进去看源码,我们是一无所知的。这一种不明确即是一种抽象,通过抽象实现分离。
简单工厂模式
通过用户的选择动态化地创建类的实例。
如:JDK Calendar.createCalendar()
优点:支持动态化,即用户传入参数即可创建对象。由于参数是变量,所以可在运行时确定。因此可以使用配置文件、注解的方式实现灵活的参数传入。
缺点:违背“开放-封闭原则”。
工厂方法&抽象工厂模式
我觉得用这个定义就已经足够了:定义一个创建对象的接口,让创建对象(类的实例化)的过程延迟到其子类实现。
这样,用户将创建对象的过程分为两步。第一步,拿到具体的工厂实现类,第二步,通过工厂类(运用多态)创建对象。
优点:
- 当需要创建多个同类对象时,若需求更改,需要创建另外一个类型的对象,这个时候只需要更改第一步创建工厂实现类的过程(只有一处),而不需要更改通过工厂创建对象的过程(有很多处)。
- 在简单工厂模式的基础上,通过“依赖-倒置原则”满足了“开放-封闭原则”。
缺点:代码复杂,需要创建许多类,且用户在得到创建的对象前需要手动创建具体工厂。