工厂模式实现
根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。该模式用于封装和管理对象的创建,是一种创建型模式。
简单工厂模式
用户需要提供产品的元信息,根据元信息,工厂返回产品对象。强调的是生产哪一种具体的产品
类图
实现方式
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。
定义产品接口
//汽车的抽象接口,定义car的动作,具体实现交由子类实现
interface Car {
//提供驾驶方法,具体怎么驾驶由具体子类实现
fun driver()
}
子类实现产品接口
//吉普车
class JPCar : Car {
override fun driver() {
Log.i("test", "driver fast")
}
}
工厂类根据用户需求返回具体产品(核心)
class CarFactory {
fun createCar(type:String):Car{
val car:Car;
when (type){
"JPCar" -> car=JPCar()
"QQCar" -> car=QQCar()
else -> car=QQCar()
}
return car;
}
}
适用性
一个类知道要哪一种产品(即factory类中的元信息)
不同产品有自己独特的实现(即JPCar
去实现父类的driver()
方法)
工厂方法模式
将生成具体产品的任务分发给具体的产品工厂,不需要我们再提供产品的元信息,因为工厂本身就已经跟具体产品绑定了
类图
实现方式
定义一个抽象工厂,其定义了产品的生产接口,但不负责具体的产品,将生产任务交给不同的派生类工厂。这样不用通过指定类型来创建对象了。
其实就是将CarFactory
拆解成抽象方法实现,好处就是在新增加Car
类型时候不需要通过修改CarFactory
的方式,而是新增Factory
类的形式
定义抽象工厂接口(核心)
//工厂的抽象
interface AbstractFactory {
fun createCar():Car
}
子类实现工厂抽象
class JPFactory : AbstractFactory {
override fun createCar(): Car {
return JPCar()
}
}
用户根据具体的工厂获取具体产品
public fun initMethodFactory(){
val carFactory : AbstractFactory = JPFactory()
carFactory.createCar().driver();
}
适用性
当一个类希望由它的子类来指定它所创建的对象的时候。
抽象工厂模式
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
其实就是将抽象工厂能创建出不同类别的产品,上面的工厂不管怎么加都只能在Car
的类别下,如果要加入其他类别,如果复刻一遍显然有点复杂了,我们只需在抽象类中加入一个新的品类就行了,至于工厂能不能生产该品类由工厂自己决定,
类图
实现
赋予抽象工厂更多的类别(核心)
interface MoreTypeAbstractFactory {
fun createCar(): Car?
fun createPen(): Pen?
}
交由子类实现
class JPFactory2 :MoreTypeAbstractFactory {
override fun createCar(): Car? {
return JPCar()
}
//这个工厂说我不生产Pen
override fun createPen(): Pen? {
return null;
}
}
实例化工厂创建产品对象
public fun initAbstractFactory(){
val factory=JPFactory2()
factory.createCar()?.driver()
factory.createPen()?.write()
}
适用性
当你要强调一系列相关的产品对象的设计以便进行联合使用时
一般来说工厂中的多个产品之间是有逻辑联系的
总结
- 简单工厂模式:一个工厂方法创建不同类型的对象
- 工厂方法模式:一个具体的工厂类负责创建一个具体对象类型
- 抽象工厂模式:一个具体的工厂类负责创建一系列相关的对象
工厂模式解决的是如何创建对象,是对创建对象的一个封装,通过创建工厂得到产品的对象,也能实现不同产品在工厂这层逻辑上实现关联,工厂其实也是对产品的一种分类,这样上层感受到的是创建的类别,从而弱化了产品对象本身,但实现的具体逻辑在产品身上,这样也使得拓展性没有阻碍