设计模式:java中工厂模式和抽象工厂模式的区别

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");
}

}

抽象工厂比普通工厂难理解点,主要在于他定义到了具体产品,也就是我们自己在写抽象工厂的时候,得实现多种产品方案(例如倒计时的多种样式,文本的多种选择样式),如果要修改必须修改工厂类了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值