Unity【话大】设计模式之工厂方法

简介: 前言:笔者在最开始写程序的时候经常会遇到一种情况,例如更改一个字段、或者添加一种小功能,就要把原来写过的东西几乎废弃掉,或者更改大量以前写过的代码。又或者自己写的东西时间久了再去回顾,完全找不到到时为什么这么写的头绪,如果遇到了Bug更是无法快速定位在哪里小范围出现的问题。

前言:笔者在最开始写程序的时候经常会遇到一种情况,例如更改一个字段、或者添加一种小功能,就要把原来写过的东西几乎废弃掉,或者更改大量以前写过的代码。又或者自己写的东西时间久了再去回顾,完全找不到到时为什么这么写的头绪,如果遇到了Bug更是无法快速定位在哪里小范围出现的问题。如果你也经常遇到这种问题,就说明你现阶段非常需要学习下设计模式了

在网上经常说的设计模式有23种,也有一些更多的设计模式,无非也是从这些设计模式中变种而来。如果让笔者来形容什么是设计模式,我认为设计模式是:一种思想,一种模式,一种套路,一种解决问题的高效策略

举个生活中的列子:你需要从家去公园,虽然都是从A点到B点,但目的是着急取东西,你会用代步工具快速到达,但如果仅仅是打发时间,完全可以散步去。用代步工具和散步本身没有绝对的对错,只是根据当时的需求采取的策略。设计模式这种思想,就是根据你当时的需求给你提供最高效的策略。



有说的不正确或者不准确的地方欢迎留言指正


有什么有趣的写作技巧或者想法欢迎大家给我留言,大家的帮助是我写下去最有效的动力



在上次的【话大】设计模式之简单工厂笔者有提到过还有跟多优化的地方,下面笔者跟大家聊一聊简单工程的优化版 ------【工厂方法】

现在我们的策划大佬来了新的需求,说海澜我们现在需要增加“产品”,原来的“产品”不好,全部去掉,换成10个新的,而且每个“产品”在生产之前要有一些检测机制。按照简单工厂的套路,我们知道,在工厂类Switch中把原来的产品的case删掉,然后添加10个新的case,然后在对应的语句块中添加需要的检测机制。设计模式之面向对象七大原则我们知道,这种方式违背了单一原则开闭原则违背单一原则是因为过多的涉及其他产品的生产,虽然都是生产产品。违背开闭原则是因为,在一个工厂类中有许多产品的产生,不管是增加产品或者是对单一产品的修改都有可能造成其他产品的干扰。所以我要对他们进行再次的分离,再次的封装。

public interface IProduct{}

public class Computer : IProduct{}

public class IPhone : IProduct{}

public class Mac : IProduct{}

public class IPad : IProduct{}
public interface IFactory
{
    IProduct CreatProduct();
}

public class FactoryComputer : IFactory
{
    public virtual IProduct CreatProduct()
    {
        return default(Computer);
    }
}

public class FactoryIPhone : IFactory
{
    public virtual IProduct CreatProduct()
    {
        return default(IPhone);
    }
}

public class FactoryMac : IFactory
{
    public virtual IProduct CreatProduct()
    {
        return default(Mac);
    }
}

public class FactoryIPad : IFactory
{
    public virtual IProduct CreatProduct()
    {
        return default(IPad);
    }
}

最终使用的时候变成了这个样子

    public void ExampleFactoryMethod()
    {
        IFactory factory = new FactoryComputer();
        IProduct computer = factory.CreatProduct();

        factory = new FactoryIPhone();
        IProduct iPhone = factory.CreatProduct();

        factory = new FactoryMac();
        IProduct mac = factory.CreatProduct();

        factory = new FactoryIPad();
        IProduct iPad = factory.CreatProduct();
    }

现在让我们和简单工厂对比一下

img_0945bdb0b022e80e1ee1b200f7992cf4.png

现在直观的看,代码量增加了,而且对产品的选择由下端工厂类又转交给上端业务逻辑层了。但笔者认为对于版本迭代来说,这种牺牲是值得的,理由有一下几点

  • 产品的增加和删除不会影响到其他产品的产出
  • 单个产品逻辑修改只需要在对应的工厂类修改即可
  • 职责更加明确,方便后续的维护和Bug定位
  • 更符合开闭原则

为什么说更符合开闭原则呢?因为如果在在版本迭代的时候,在原有产品的基础上添加检测等机制,可以用如下写法,完全不会涉及到原来类的源码。

public class FactoryIPad : IFactory
{
    public virtual IProduct CreatProduct()
    {
        return default(IPad);
    }
}


public class FactoryIPad_Extend : FactoryIPad
{
    public override IProduct CreatProduct()
    {
        /*
         * 检测一
         * 检测二
         * 检测三
         */
        return base.CreatProduct();
    }
}
img_93a5e9a4a9357f588633e47eae6def74.png

工厂方法(Factory Method),定义了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

笔者说过,运用哪种设计模式没有绝对的对错,设计模式是:一种思想,一种模式,一种套路,一种解决问题的高效策略,如果真的后续不会有什么改动,那就怎么简单怎么写就好了。当然工厂还有另一种写法,那就是【抽象工厂】,笔者后续会提到~

相关文章
|
6月前
|
设计模式 开发者
探讨常见设计模式 - 工厂方法模式的最佳实践和潜在的实施问题
【4月更文挑战第7天】工厂方法模式是创建型设计模式,提供了一种在不指定具体类情况下创建对象的方式。它定义创建对象的接口,允许子类决定实例化哪个类,从而解耦对象的创建和使用。最佳实践包括明确接口、封装创建逻辑、提供扩展点和避免过度使用。然而,过度工程、违反开闭原则、性能影响和依赖管理是可能的问题。通过权衡利弊并遵循最佳实践,工厂方法模式能在适当场景下提升代码灵活性和可扩展性。
60 1
|
23天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
2月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
2月前
|
设计模式 Java
Java设计模式-工厂方法模式(4)
Java设计模式-工厂方法模式(4)
|
3月前
|
设计模式 XML 存储
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
文章详细介绍了工厂方法模式(Factory Method Pattern),这是一种创建型设计模式,用于将对象的创建过程委托给多个工厂子类中的某一个,以实现对象创建的封装和扩展性。文章通过日志记录器的实例,展示了工厂方法模式的结构、角色、时序图、代码实现、优点、缺点以及适用环境,并探讨了如何通过配置文件和Java反射机制实现工厂的动态创建。
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
|
3月前
|
设计模式 uml
设计模式-------------工厂模式之工厂方法模式(创建型)
工厂方法模式是一种创建型设计模式,它通过定义一个用于创建对象的接口,让子类决定实例化哪一个类,从而实现类的实例化推迟到子类中进行,提高了系统的灵活性和可扩展性。
|
5月前
|
设计模式 Java
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
|
5月前
|
设计模式 搜索推荐
工厂方法模式-大话设计模式
工厂方法模式-大话设计模式
|
5月前
|
设计模式 新零售 Java
设计模式最佳套路5 —— 愉快地使用工厂方法模式
工厂模式一般配合策略模式一起使用,当系统中有多种产品(策略),且每种产品有多个实例时,此时适合使用工厂模式:每种产品对应的工厂提供该产品不同实例的创建功能,从而避免调用方和产品创建逻辑的耦合,完美符合迪米特法则(最少知道原则)。
80 6
|
5月前
|
设计模式 XML Java
【设计模式】第三篇:一篇搞定工厂模式【简单工厂、工厂方法模式、抽象工厂模式】
三 结尾 如果文章中有什么不足,欢迎大家留言交流,感谢朋友们的支持! 如果能帮到你的话,那就来关注我吧!如果您更喜欢微信文章的阅读方式,可以关注我的公众号
56 5

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    43
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    50
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    58
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    38
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    64
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    59
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    42
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    50
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    112
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    78