1. 定义:
普通工厂模式:生产具体的产品,创建的产品是类(Class)。抽象工厂模式:生产抽象的产品,创建的产品是接口(Interface)。
2. 优缺点
1.降低耦合,将具体产品的创建延迟到具体工厂的子类中
2.易于扩展,新增一种产品时,只需要增加相应的具体产品类和相应的工 厂子类即可
3.有利于产品的一致性不使用静态工厂方法,可以形成基于继承的等级结构。
缺点:当需要新增产品时,需要修改工厂基类,不符合开闭原则
3. 实例演示:
普通工厂类: abstract class NokiaPhone {
abstract fun powerOnPhone()
}
然后再写一个工厂类
abstract class Factory {
abstract fun <T : NokiaPhone> createNokia(clz: Class<T>): T
}
写一个子类继承工厂类,来用来生产
class NokiaFactory : Factory() {
override fun <T : NokiaPhone> createNokia(clz: Class<T>): T {
var nokiaPhone: NokiaPhone? = null
try {
nokiaPhone = Class.forName(clz.name).newInstance() as NokiaPhone
} catch (e: Exception) {
e.printStackTrace()
}
return (nokiaPhone as T?)!!
}
}
实现类
class N301 : NokiaPhone(){
override fun powerOnPhone() {
Log.d("Factory","N301 power on")
}
}
class N300 : NokiaPhone(){
override fun powerOnPhone() {
Log.d("Factory","N300 power on")
}
}
完成 直接调用工厂
class main {
fun mainMethed() {
var nokiaFactory = NokiaFactory()
var nokia5200 = nokiaFactory.createNokia(N300::class.java!!)
var nokiaN97 = nokiaFactory.createNokia(N301::class.java!!)
//工厂模式
nokia5200.powerOnPhone()
nokiaN97.powerOnPhone()
}
}
普通工厂模式在于只要创建当前的类,并不用实现里面的具体详情,所以用法也很明显,比较单一并不复杂的公用逻辑可以用此方法实现,而对于相对多样性的可以考虑用下面的抽象工厂去实现
抽象工厂类实现:抽象工厂主要是在于子类的实现,定位到具体生产什么产品,所以我们还是先实现一个工厂类
abstract class Factory {
abstract fun createCPU(): component.CPU
abstract fun createBattery(): component.Battery
}
然后实现基类工厂
class IPhone6Factory :Factory(){
override fun createCPU(): component.CPU {
return A9()
}
override fun createBattery(): component.Battery {
return Battery1000ma()
}
}
这里有个component接口类,具体实现自己的cpu和电池
interface component {
interface CPU {
fun showCpuname()
}
interface Battery {
fun showBatteryCapacity()
}
}
然后定义n5200和N97自己的cpu和电池
class Battery1000ma : component.Battery {
override fun showBatteryCapacity() {
Log.d("AbstractFactory", "battery is 1000ma");
}
}
class Battery1200ma : component.Battery {
override fun showBatteryCapacity() {
Log.d("AbstractFactory","battery is 1200ma");
}
}
class A9 : component.CPU {
override fun showCpuname() {
Log.d("AbstractFactory","A9")
}
}
class A10:component.CPU {
override fun showCpuname() {
Log.d("AbstractFactory","A10");
}
}
抽象工厂比普通工厂难理解点,主要在于他定义到了具体产品,也就是我们自己在写抽象工厂的时候,得实现多种产品方案(例如倒计时的多种样式,文本的多种选择样式),如果要修改必须修改工厂类了。