设计模式-工厂模式

来源:互联网 发布:端口2482 编辑:程序博客网 时间:2024/06/11 23:08

1.工厂模式的概念:通过工厂模式来代替new方法创建对象,包括工厂方法模式和抽象工厂模式,抽象工厂模式是工厂方法模式的扩展

2.工厂模式的目的:定义一个接口来创建对象,但是让子类来决定那些对象需要被实例化,工厂模式把实例化的工作推迟到子类中去实现

3.工厂模式的应用场景:

1.有一组类似的对象需要创建,比如生产毛巾的工厂一般不会生产笔记本

2.在编码时不能预知那些类是需要实例化的,比如去逛超市,我们提前没有计算要买什么,而是进入超时之后再做选择

3.需要考虑系统的扩展性,不应依赖于产品实例如何被创建,组合和表达的细节

4.代码实现:

1.接口:

public interface CarInterface {

void CreatCar();

}

2.实现类:

public class BenT implements CarInterface {

@Override

public void CreatCar() {

System.out.println("创建了一辆本田");

}

}public class FuT implements CarInterface {

@Override

public void CreatCar() {

System.out.println("创建了一辆福特");

}

}

3.工厂:

public class Factory {

public CarInterface getCreat(String className) throws ClassNotFoundException, IllegalAccessException, InstantiationException {

CarInterface carInterface = (CarInterface) Class.forName(className).newInstance();

return carInterface;

}

}

5.spring中的BeanFactory举例:

1.BeanFactory作为Spring基础的IOC容器,是S平ring的一个Bean工厂

2.如果单从工厂模式考虑,BeanFactory就是用来生产Bean,然后提供给客户端

6.Spring中Bean的实例化过程:

1.通过类默认的构造器或者指定的构造器来实例化Bean(暂成为instanse1)

2.如果Bean的配置文件中配置了Bean的属性值,则在instance1的基础上进行属性注入,这种注入是覆盖性的,得到instance2

3.如果Bean实现了InitializableBean接口,则调用afterPropertiesSet()方法来操作instance2,得到instance3

4.如果Bean的配置文件中配置了init-method="init",则会调用指定的初始化方法,则在instance3的基础上调用指定的初始化方法,得到instance4,当然,这个初始化的名字是任意的

7.工厂方法模式和抽象工厂模式的区别:

1.工厂模式是一种极端的抽象工厂模式,而抽象工厂模式可以看作是工厂模式的扩展

2.工厂模式是用来创建一个产品的等级架构,而抽象工厂模式则是用来i创建多个产品的等级架构

3.工厂模式只有一个抽象产品类,而抽象工厂模式则有多个抽象工厂类

8.工厂模式的优点:

1.系统可以在不修改工厂角色的情况下引进新的产品

2.客户端不必关心对象的创建,明确了职责

3.更好的理解面向对象原则,面向接口编程

9.工厂模式的价值:

   1. 有利有弊   

优点:将对象的创建统一起来便于维护和整体把控,对扩展开放,对修改封闭

缺点:耦合性提高,由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中,这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利。

2.使用有限制

从工厂模式的示例可以看出:工厂模式需要类实现它的接口并且在业务内部存在明显的继承关系,比如汽车和奔驰宝马的关系。而继承关系往往存在于模型之间,业务之间很难存在继承关系,因此如果业务内部或者业务之间没有这种显式的继承关系该咋办?就算业务内部有继承关系,各个业务交给你统一管理,这样就会提高代码的耦合性,当创建逻辑复杂的时候,工厂方法就很复杂,容易产生干扰。

3.其开闭性优点很容易被替代

可以通过高度层次化和模块化来提高系统的开闭性,而不必生硬地去套用工厂模式。