网站开发中数据库的设计原则,站嗨免费建站,浙江百度代理公司,官方网站找做化妆品套盒子目录导航 抽象工厂及其作用工厂方法的好处工厂方法的实现关系图实现步骤 工厂方法的适用场景工厂方法举例 抽象工厂及其作用
工厂方法是一种创建型设计模式。所谓创建型设计模式是说针对创建对象方面的设计模式。在面向对象的编程语言里#xff0c;我们通过对象间的相互协作我们通过对象间的相互协作共同完成复杂的业务逻辑因为对象之间存在着依赖关系。 当对象A依赖对象B时我们不采取直接创建对象B的方式即B productB new B()
public class A {public void bizLogic(){//do something...B b new B();//do something...}
}而是在A的父类中定义一个返回B类型对象的方法通常该方法的返回值是接口类型或者BaseClass类型允许A的子类覆盖该方法返回不同的对象类型C但需满足C extends/implements B。在父类A中该方法既可以是抽象方法也可以不定义为抽象方法返回默认的B类型实例。
public abstract class A {public void bizLogic(){//do something...B b createB();//do something...}public abstract B createB();
}这种创建对象的设计模式称之为工厂方法。为什么叫工厂方法通常对象被称之产品而生产产品的工具称之为工厂由于在这种设计模式中是一个方法承担工厂的作用所以称之为工厂方法。
工厂方法的好处
乍一看似乎我们只是把创建对象B的代码抽取到了一个方法中而已实际上这种设计模式有着诸多好处。
解耦。避免对象A与被依赖方B的具体实现类强耦合对于A来说我只需要一个B类型的实例并不关心具体实现类利于程序扩展。符合单一职责的原则。类的设计原则之一便是单一职责。A的主要职责肯定不是创建B对象而是依赖B对象完成特定的业务功能。将创建B的代码单独抽离使得A的职责更加清晰。符合开闭原则。后续可以引入多个B的子类而不会“惊动”A的代码。
工厂方法的实现
关系图
依赖方A我们称之为Creator即需要创建产品B的类被依赖方B称之为Product即产品。它们的关系图如下 实现步骤
为对象B定义一个统一的接口B_interface或基类B_base_class并在其中定义对外提供功能的统一接口方法定义一批B的子类以实现差异化功能所有的子类需实现B_interface或继承B_base_class。在对象A的父类中定义一个返回B对象的方法返回值类型为B_interface或B_base_class。该方法可为抽象方法也可返回默认的B实例视实际使用需求而定。将对象A中直接创建对象B的代码全部替换成定义好的工厂方法。定义一批A的子类在子类中重写工厂方法返回不同的B实例。
工厂方法的适用场景
当我们实现业务代码时无法提前获知所依赖对象的具体类型这通常发生在顶层设计的时候此时可以通过工厂方法抽象定义所需的对象。我们打包一个库给他人使用时其中一些业务逻辑我们无法确定用户是应该使用库里定义好的一些默认组件还是想使用自己扩展后的组件继承默认组件可通过工厂方法解决该问题。被依赖的对象可能比较特殊占用一定的系统资源所以不能任意创建可在工厂方法内实现一定的控制逻辑控制对象的创建过程避免资源浪费。
工厂方法举例
工厂方法在代码设计中几乎无处不在这里举一个Android中的例子。我们在创建Fragment时都要继承Fragment基类并实现onCreateView方法该方法负责创建一个视图对象由于基类并不清楚子类会返回一个什么样的视图对象所以该方法是一个工厂方法返回值定义为基类View。
public class SubFragment extends Fragment {NullableOverridepublic View onCreateView(NonNull LayoutInflater inflater, Nullable ViewGroup container, Nullable Bundle savedInstanceState) {return new SubView(getContext());}
}