各种文章网上特别多,下面贴一个我觉得不错的,供大家学习。我就不重复了,没啥意思。
重点来讲讲自己的理解:
简单工厂:自己就负责对象创建。
工厂方法:统一接口定义方法,具体创建由子类实现
用户:我要一个东北虎
简单工厂:我自己就会!做好了,给你
工厂方法:我只规定了我的儿子们能做虎。你要东北虎,你去找我儿子东北虎工厂。
东北虎工厂:做好了,给你
抽象工厂:如果我们的需求,只是创建猫和狗,那简单工厂和工厂方法都ok。后来随着发展,猫也要分类了,分为布偶和美短。狗分为二哈和泰迪。此时如果用工厂方法,我们就需要四个工厂,分别创建四个对应的对象,显然不是很简便。此时应用抽象工厂。父类:两个方法,createCat和createDog。两个子类工厂,按某个维度区分。比如中国只生产二哈美短,美国生产布偶和泰迪。那就有两个子类工厂,其中ChinaAnimalFactory实现了createCat,只create美短;实现了createDog,只create二哈。AmericaAnimalFactory对应实现了创建布偶和泰迪。
相对工厂方法,抽象工厂的工厂实例,可以创建多个不同的实例,而工厂方法的工厂实例只能创建某一特定实例。此为区别
当一件事物,有不同的细分各类,比如动物分为猫科犬科,猫科犬科下面又有不同细分,这时候可以使用工厂模式,封装内部实现,简化代码。
但是如果看相应的工厂,就人发现内部实现,还是在用if语句判断入参,从而实例化相应的对象。那么意义何在?
个人理解:实际的情况,往往不是单层的分类,而是多层。比如下图:
这种情况下,当我们通过工厂实例化一个东北虎,实际上已经经过了层层判断,工厂可以隐藏这几层,从而使代码优雅。
另外每个实例上的属性,比如奔跑,也通过实例内部的构造方法,自己搭配了不同的属性和能力,这部分也得到了隐藏和隔离,使代码优雅、易维护、易拓展。
工厂模式归属于建造模式大类,是为了优雅地实现实例的建造。是为了分离实例的创建和使用。
想像一下如果没有这个模式,我new一个东北虎,然后要set他的食谱,set速度,栖息地等,是不是很麻烦?而使用工厂模式之后,只需要指定:我要东北虎,这一系列动作已经实现。实现了前文据说:创建与使用分离。
这个理念与java代码设计的依赖倒置,其实有所关联,有兴趣的读者可以自己联系起来理解一下,会有所帮助 。