工厂方法是非常古老且常用的设计模式。原因主要是一个系统要运转起来一定会涉及到对象的实例化过程,如果对象的实例化分散在各种逻辑代码之间,那么就会非常零乱、难以维护,bug 自然也多。
工厂方法的出现解决的就是对象创建的问题,把建立对象实例交给子类来进行。说白了,就是把建立对象实例的过程从正常的业务逻辑中剥离出去,通过抽象来实现。
众所周知,设计模式是一个综合性使用的过程,如果单一地使用设计模式,往往会让你的代码显得繁杂且难以理解。同时设计模式也是大厂面试的常见问题,《大厂高频设计模式应用及分析》对设计模式高频考点有详细讲解。
假设现在我们有这样一个 class,拥有底层的显示商城 Banner 的能力,这是之前我们用适配器模式建立的架构。
public class Main{
public static void main(String[] args){
MobilePhoneBanner view = new MobilePhoneBanner();
view.showBanner();
}
}
可以看到外层调用仍然需要去感知什么样的设备应该实例化什么 Banner 的过程。现在我们用工厂方法改进这个架构,即解决调用方感知要实例化哪一种 Banner 对象的问题。
这里我们用简单工厂模式就可以了,简单地说,就是把薄的那一层的能力抽象出来沉淀。
首先用接口规约工厂类的能力,基本原则是同一个工厂实例化的类一般来说在同一个继承树上。
public interface IBannerFactory{
AbstractBannerScene createBannerMatchDevice(DeviceTYpe deviceType);
}
然后给我们要创建的子类增加一个父类
public abstract class AbstractBannerScene{
public abstract void showBanner();
}
public class MobilePhoneBanner extends AbstractBannerScene{
private CreateBannerView createBannerView;
public class PCBanner extends AbstractBannerScene{
private CreateBannerView createBannerView
实现工厂方法接口
public class BannerFactory implements IBannerFactory{
@Override
public AbstractBannerScene createBannerMatchDevice(DeviceTYpe deviceType){
if(deviceType == DeviceType.MOBILEPHONE){
return new MobilePhoneBanner();
}else{
return new PCBanner();
}
}
}
改进后的调用
public class Main {
public static void main(String[] args) {
IBannerFactory factory = null;
try {
factory = (IBannerFactory) Class.forName("designpattern.factory.BannerFactory").newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
factory.createBannerMatchDevice(DeviceType.MOBILEPHONE).showBanner();
}
}
总结下工厂方法模式架构
这里 BannerFactory 被 IBannerFactory 进行接口规约,接口是架构的边界。
封装和继承是设计模式的“原料”,接口和抽象类的使用可以有效的改进我们的架构。
设计模式在架构中要综合使用,同样的场景可以适配多种设计模式,但切记不要过度设计。
以上内容我在《大厂高频设计模式应用及分析》中都有详细讲解,此外我会从零开始一个项目通过注入设计模式思想来迭代我们的架构,在不借助任何开源框架的基础上开始我们的编码。一次性搞定包括工厂方法、责任链模式、单例模式等在内的大厂设计模式高频考点。现在点击原价购买,然后在选择优惠框输入折扣码:58D382,即可 9 元获得全部课程!
1
jones2000 2020-10-14 00:58:28 +08:00
少一个动态注册新的类到工厂类中,否在每次增加新的类都需要手动增加到 createBannerMatchDevice(), 耦合太大,不利于模块化。
|