设计模式——工厂模式
当看到“new”就想到“具体”,增加了耦合度。
提取客户的代码中变化部分(new创建对象),单独创建一个对象(工厂)来处理“new”。这样,创建新类时,我们就不需要修改客户端代码,修改工厂对象即可。也可以把这个工厂定义为静态方法(静态工厂)
简单工厂模式
简单工厂模式的工厂类一般采用静态方法,通过接收不同的参数决定返回不同的对象(根据不同的条件创建不同实例)。工厂类集中了所有实例的逻辑,违反了高内聚这一原则,它所能创建的类只能是事先考虑好的,如果一旦添加新的类就需要改变工厂类了
工厂方法模式
定义:工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个.工厂方法(接口中创建对象的方法)让类把实例化延迟到子类.
工厂方法模式类图:
与简单工厂的区别:简单工厂是将对象的创建封装起来,但是它不具备工厂方法的弹性(ConcreteCreator可以有多个,需要哪个就调用哪个),不能变更正在创建的产品。
工厂方法模式的核心工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去完成,这就允许系统在不修改工厂角色的情况下,创建新的产品。
设计原则:要依赖抽象,不要依赖具体类。即不能让高层组件依赖低层组件,并且两者都应该依赖抽象。
依赖倒置原则(如果具体类不会改变则不需要遵守):
-
变量不可以持有具体对象的引用(new就会持有具体类,可以使用工厂)
-
不要让类派生自具体类(派生自抽象)
-
不要覆盖基类已实现的方法
抽象工厂模式
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类
与工厂方法模式的区别:工厂方法使用继承,抽象工厂使用组合,而且适用于产生一系列产品集合,可以用来产生新产品集合,但是如果增加一个新产品,则要改动几乎所有的工厂类。
区别:
简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)
工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)
抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
工厂方法模式与抽象工厂模式
工厂方法模式: 一个抽象产品类,可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类只能创建一个具体产品类的实例。 抽象工厂模式: 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类可以创建多个具体产品类的实例。 区别: 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
对于java来说,大部分抽象工厂模式都是这样的: ---它的里面是一堆工厂方法,每个工厂方法返回某种类型的对象。 比如说工厂可以生产鼠标和键盘。那么抽象工厂的实现类(它的某个具体子类)的对象都可以生产鼠标和键盘,但可能工厂A生产的是罗技的键盘和鼠标,工厂B是微软的。 这样A和B就是工厂,对应于抽象工厂; 每个工厂生产的鼠标和键盘就是产品,对应于工厂方法; 用了工厂方法模式,你替换生成键盘的工厂方法,就可以把键盘从罗技换到微软。但是用了抽象工厂模式,你只要换家工厂,就可以同时替换鼠标和键盘一套。如果你要的产品有几十个,当然用抽象工厂模式一次替换全部最方便(这个工厂会替你用相应的工厂方法) 所以说抽象工厂就像工厂,而工厂方法则像是工厂的一种产品生产线