简单工厂
1,将对象的创建和对象本身业务处理分离可以降低系统的耦合度,使得两者修改起来都相对容易。
2,在调用工厂类的工厂方法时,由于工厂方法是静态方法,使用起来很方便,可通过类名直接调用,而且只需要传入一个简单的参数即可,在实际开发中,还可以在调用时将所传入的参数保存在XML等格式的配置文件中,修改参数时无须修改任何源代码。
3,简单工厂模式最大的问题在于工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,这一点与开闭原则是相违背的。
4,简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。
自我理解:简单工厂将创建对象的过程转移到了工具之中,对外隐藏了对象的创建,外部只需要传入对象创建的参数,工厂就可以利用工厂中提供的Creat方法返回相应的对象,因此工厂中需要定义返回函数。对于简单工厂,只有一类对象(product),区别于抽象工厂。
工厂方法
工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责哪一个产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。
工厂方法:对于工厂方法已经对工厂进行了抽象,减轻了工厂的职责。更加容易扩展。值得注意的是此时已然只有一种产品(Log),此时仍然区别于抽象工厂。
抽象工厂
1,抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。
2,抽象工厂模式包含四个角色:抽象工厂用于声明生成抽象产品的方法;具体工厂实现了抽象工厂声明的生成抽象产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中;抽象产品为每种产品声明接口,在抽象产品中定义了产品的抽象业务方法;具体产品定义具体工厂生产的具体产品对象,实现抽象产品接口中定义的业务方法。
3,抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构。
4,抽象工厂模式的主要优点是隔离了具体类的生成,使得客户并不需要知道什么被创建,而且每次可以通过具体工厂类创建一个产品族中的多个对象,增加或者替换产品族比较方便,增加新的具体工厂和产品族很方便;主要缺点在于增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。
5,抽象工厂模式适用情况包括:一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节;系统中有多于一个的产品族,而每次只使用其中某一产品族;属于同一个产品族的产品将在一起使用;系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。
抽象工厂:在简单工厂和工厂方法的基础上发展而来,继承了简单工厂的特点(把对象的创建转移到了工厂中),也继承了工厂方法的概念(增加了抽象工厂)。在此基础上,抽象工厂出现了多类抽象对象(ABStractProductA,ABStractProductA)这就是使用抽象工厂的目的。出现了产品结构和产品族的概念
-
产品等级结构 :产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
-
产品族 :在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。
三者的区别:
抽象工厂:含有多类工厂,每个工厂生产多类产品
例如:海尔工厂生产电视类,生产冰箱类。海信工厂生产电视类,生产冰箱类。工厂方法:含有多类工厂,每个工厂生产同一类产品
例如:海尔工厂只生产电视类,海信工厂只生产电视类。简单工厂:含有一个工厂,只生产一类产品的多个形式
例如:海尔工厂生产电视,没有海信工厂。
细细品~~~
模式结构图取自:
https://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/abstract_factory.html 详细内容可查看