• 面向对象编程思想-工厂方法模式


    一、引言

    上篇博客中,我们有讲到简单工厂模式,它解决了客户端和对象之间直接依赖的问题,但只要新增加产品就需要修改工厂类,这样使得简单工厂类的逻辑会变得越来越复杂。那如何解决这个问题呢?下面来看看今天我们学习的工厂方法模式,是如何解决这个问题的。

    二、工厂方法模式

    定义:工厂方法模式将对象的创建放在具体的工厂中去做,不再将所有的逻辑集中在工厂里,而只是提供具体工厂必需实现的接口,这样新增加产品时就不需要修改工厂类,可以通过新增加具体工厂类的方式解决简单工厂的问题。下面通过一个例子,帮助我们理解工厂方法模式

    下面是代码demo:

    namespace DNA.Framework.FactoryMethod
    {
      //车子抽象类
    public abstract class BaseCar { public abstract void Run(); } }
    namespace DNA.Framework.FactoryMethod
    {
      //宝马类
    class BMW : BaseCar { public override void Run() { Console.WriteLine("我今天开{0}去上班",this.GetType().Name); } } }
    namespace DNA.Framework.FactoryMethod
    {
        class MBZ : BaseCar
        {
        //奔驰类
    public override void Run() { Console.WriteLine("我今天开{0}去上班", this.GetType().Name); } } }
    namespace DNA.Framework.FactoryMethod
    {
      //接口工厂类(这里其实用抽象类较好)
    interface IBaseFactory { BaseCar GetCar(); } }
    namespace DNA.Framework.FactoryMethod
    {
      //宝马工厂类
    class BMWFactory:IBaseFactory { public BaseCar GetCar() { return new BMW(); } } }
    namespace DNA.Framework.FactoryMethod
    {
      //奔驰工厂类
    class MBZFactory : IBaseFactory { public BaseCar GetCar() { return new MBZ(); } } }
    namespace DNA.Framework.FactoryMethod
    {
      //客户端调用
    class Program { static void Main(string[] args) {  
           //初始化工厂 IBaseFactory bmwFactory
    = new BMWFactory();
           //通过工厂创建对象 BaseCar bmw
    = bmwFactory.GetCar(); IBaseFactory mbzFactory = new MBZFactory(); BaseCar mbz = mbzFactory.GetCar(); // IBaseFactory ferrariFactory = new FERRARIFactory(); // BaseCar ferrari = ferrariFactory.GetCar(); bmw.Run(); mbz.Run(); // ferrari.Run(); Console.Read(); } } }

    当我们需要新增一个产品的时候,比如我想开法拉利去上班,只需要新增具体的工厂类,产品类,不用去修改抽象工厂和具体工厂类中的代码,通过多态性完成了系统的扩展。比如某天我想开着法拉利去上班,只需要新增法拉利工厂和法拉利类就可以实现,代码如下:

    namespace DNA.Framework.FactoryMethod
    {
      //法拉利工厂类
    class FERRARIFactory : IBaseFactory { public BaseCar GetCar() { return new FERRARI(); } } }
    namespace DNA.Framework.FactoryMethod
    {
      //法拉利类
    class FERRARI:BaseCar { public override void Run() { Console.WriteLine("我今天开{0}去上班", this.GetType().Name); } } }

    优点:比起简单工厂

    工厂方法模式把对象创建延迟到具体的工厂类中,相对简单工厂的不足做了优化,对扩展开放,对修改封闭,很好的符合了开闭原则。

    补充:并不是工厂方法模式比简单工厂模式好,要看具体应用什么到什么样的业务场景。

    本文关于设计模式之工厂方法模式的学习就到这里了,希望能够帮到你,若有不足,欢迎斧正,感谢您的阅读。

    参考:http://www.cnblogs.com/zhili/p/SimpleFactory.html

  • 相关阅读:
    nacos + seata 报错 endpoint format should like ip:port
    Error creating bean with name 'com.example.demo.ProviderFacade': Requested bean is currently in creation: Is there an unresolvable circular reference?
    leetcode 剑指 Offer 65不用加减乘除做加法
    vscode使用spring boot配置详解
    使用springmvc中视图解析器InternalResourceViewResolver遇到访问出错
    docker tomcat修改时区有效方法
    wsl2 docker mysql重启之后无法连接问题
    docker tomcat部署应用并且连接到docker mysql数据库
    vscode git使用
    vscode wsl2使用maven操作{添加包到meavn,测试操作}
  • 原文地址:https://www.cnblogs.com/jdzhang/p/6928610.html
Copyright © 2020-2023  润新知