您现在的位置是:主页 > news > 政府网站建设管理工作情况汇报/山西优化公司

政府网站建设管理工作情况汇报/山西优化公司

admin2025/5/3 5:21:45news

简介政府网站建设管理工作情况汇报,山西优化公司,仿拉勾网 wordpress,郑州吧# 序言工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重问题(原文:投稿:设计模式之工厂方法模式),由于工厂模式中的每个工厂只能生产一类产品,可能会导致大量的工厂类,,势…

政府网站建设管理工作情况汇报,山西优化公司,仿拉勾网 wordpress,郑州吧# 序言工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重问题(原文:投稿:设计模式之工厂方法模式),由于工厂模式中的每个工厂只能生产一类产品,可能会导致大量的工厂类,,势…

# 序言

工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重问题(原文:投稿:设计模式之工厂方法模式),由于工厂模式中的每个工厂只能生产一类产品,可能会导致大量的工厂类,,势必会增加系统的开销,此时可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来生产。———这也就是抽象工厂的基本思想。

# 产品等级结构与产品族

在讲抽象工厂模式之前,我们必须明白两个概念:产品等级结构 、 产品族。

产品等级结构:产品等级结构即产品的继承结构, 如一个抽象类是手游,其子类有腾讯的手游、 网易的手游、 盛大的手游等等。则抽象手游与具体游戏公司的手游构成一个产品等级结构,手游是父类,而其它具体公司的手游则是子类。

产品族:在抽象工厂模式中,产品族是指由同一个工厂生产,位于不同产品等级结构中的一组产品。如腾讯公司生产的手游、端游、页游, 腾讯的手游则位于手游产品等级结构中,腾讯的端游则位于端游产品结构中, 腾讯的手游、 端游、 页游就构成了一个产品族。

d403d622793da6bddda43f5e3591f3f7.png

我们看到不同的颜色的多个椭圆形、正方形、三角形分别构成了三个不同的产品等级结构,而颜色相同的椭圆、正方形、三角形构成一个产品族,可以看到每一个形状都位于某个产品族,并不属于某个产品等级结构,图中有4个产品族,分属于3个不同的产品等级结构。只要知道一个产品的所处的产品族和产品等级结构,就可以确定这个产品。

# 抽象工厂模式

定义:提供一个创建一系列相关或相互依赖的接口,而无需指定它们具体的类。抽象工厂模式又称为Kit模式,它也是一种对象创建型模式。

9eafd8d76b04de2aa48a8bec599a3fbf.png

在抽象工厂模式有一下几个角色:

AbstractProduct(抽象产品):为每种产品声明接口,在抽象产品中声明了产品所有的业务接口。

ConcrteProduct(具体产品) :定义具体的工厂生产的具体产品对象,实现了抽象产品的所有方法。

AbstractFactory(抽象工厂):声明了创建一组用于创建一族产品的接口,每个方法对应一种产品。

ConcreteFactory(具体工厂):实现了抽象工厂中所有的接口,这些接口返回的产品构成了一个产品族,每个产品都位于某个产品等级结构中。

代码实现

AbstractProduct(抽象产品)

/** * @program * @Desc    抽象 产品A * @Author 游戏人日常 * @CreateTime 2019/07/15--18:56 */public abstract class AbstractProductA {}/** * @program * @Desc    抽象 产品B * @Author 游戏人日常 * @CreateTime 2019/07/15--18:57 */public abstract class AbstractProductB {}

ConcreteProduct(具体产品) :产品A和产品B构成产品族, A1和A2构成产品等级结构。

  /** * @program * @Desc   具体的产品 A1 * @Author 游戏人日常 * @CreateTime 2019/07/15--19:04 */public class ConcreteProductA1 extends AbstractProductA{}/** * @program * @Desc   具体的产品 B1 * @Author 游戏人日常 * @CreateTime 2019/07/15--19:04 */public class ConcreteProductB1 extends AbstractProductB{}/** * @program * @Desc   具体的产品 A2 * @Author 游戏人日常 * @CreateTime 2019/07/15--19:03 */public class ConcreteProductA2 extends AbstractProductA{}/** * @program * @Desc   具体的产品 B2 * @Author 游戏人日常 * @CreateTime 2019/07/15--19:07 */public class ConcreteProductB2 extends AbstractProductB {}

AbstractFactory(抽象工厂)

/** * @program * @Desc  抽象工厂 * @Author 游戏人日常 * @CreateTime 2019/07/15--19:16 */public abstract class AbstractFactory {    public abstract AbstractProductA createProductA();    public abstract AbstractProductB createProductB();}

ConcreteFactory(具体工厂)

/** * @program * @Desc  具体工厂 1 * @Author 游戏人日常 * @CreateTime 2019/07/15--19:20 */public class ConcreteFactory1 extends AbstractFactory {    @Override    public AbstractProductA createProductA() {        return new ConcreteProductA1();    }    @Override    public AbstractProductB createProductB() {        return new ConcreteProductB1();    }}/** * @program * @Desc  具体工厂 2 * @Author 游戏人日常 * @CreateTime 2019/07/15--19:21 */public class ConcreteFactory2 extends AbstractFactory {    @Override    public AbstractProductA createProductA() {        return new ConcreteProductA2();    }    @Override    public AbstractProductB createProductB() {        return new ConcreteProductB2();    }}

客户端测试

/** * @program * @Desc * @Author 游戏人日常 * @CreateTime 2019/07/15--19:25 */public class Test {    public static void main(String args[]){        //声明一个工厂1  就可以生产 A1和B1     AbstractFactory factory1= new ConcreteFactory1();     AbstractProductA productA1=factory1.createProductA();     AbstractProductB productB1=factory1.createProductB();        //声明一个工厂2  就可以生产 A2和B2     AbstractFactory factory2= new ConcreteFactory2();     AbstractProductA productA2=factory2.createProductA();     AbstractProductB productB2=factory2.createProductB();            }}

# “开闭原则”的倾斜性

在抽象工厂模式中,增加新的产品族很方便,但是增加新的产品等级结构就很麻烦,抽象工厂模式的这种性质称为“开闭原则“的倾斜性。

增加产品族:对于增加新的产品族,只需要增加个具体的产品并对应增加个具体工厂,对已有的代码不用修改,符合”开闭原则“。

增加新的产品等级结构:对于增加新的产品等级结构,就需要修改工厂角色,包括抽象工厂,需要增加新产品的方法,相应的具体工厂也要改。违背了”开闭原则“。

代码如下

新增的产品组:

/** * @program * @Desc * @Author 游戏人日常 * @CreateTime 2019/07/15--20:33 */public class ConcreteProductA3 extends AbstractProductA {}/** * @program * @Desc * @Author 游戏人日常 * @CreateTime 2019/07/15--20:33 */public class ConcreteProductB3 extends AbstractProductB {}

新增具体的工厂

/** * @program * @Desc * @Author 游戏人日常 * @CreateTime 2019/07/15--20:34 */public class ConcreteFactory3 extends AbstractFactory {    @Override    public AbstractProductA createProductA() {        return new ConcreteProductA3();    }    @Override    public AbstractProductB createProductB() {        return new ConcreteProductB3();    }}

客户端测试

/** * @program * @Desc * @Author 游戏人日常 * @CreateTime 2019/07/15--19:25 */public class Test {    public static void main(String args[]){        //声明一个工厂1  就可以生产 A1和B1     AbstractFactory factory1= new ConcreteFactory1();     AbstractProductA productA1=factory1.createProductA();     AbstractProductB productB1=factory1.createProductB();        //声明一个工厂1  就可以生产 A2和B2     AbstractFactory factory2= new ConcreteFactory2();     AbstractProductA productA2=factory2.createProductA();     AbstractProductB productB2=factory2.createProductB();        //(新增)  声明一个工厂3  就可以生产 A3和B3      AbstractFactory factory3= new ConcreteFactory3();      AbstractProductA productA3=factory2.createProductA();      AbstractProductB productB3=factory2.createProductB();    }}

# 总结

抽象工厂模式是工厂方法模式的进一步延申,继承了工厂方法模式的优点,也弥补了工厂方法模式的一些缺点。工厂方法模式针对的是一个产品等级结构,而抽象工厂模式是面对多个产品等级结构。

抽象工厂模式增加产品族方便,无需修改代码,只需增加具体的产品类和具体工厂类,符合”开闭原则“。增加产品等级结构就需要改工厂类(抽象和具体的工厂都改)

# 优缺点

优点

  • 抽象工厂模式隔离了具体类的生成,使得客户端并不需要知道什么被创建,由于这种隔离,更换一个具体工厂相对容易些。

  • 当一个产品族中的多个对象被设计成一起工作时,这样能够保证客户端始终只使用同一个产品族中的对象。

  • 增加新的产品族很方便,无需修改已有代码,符合“开闭原则”。

缺点

增加新的产品等级结构麻烦,需要对原来的系统有较大的修改,还会修改抽象层代码,这不符合”开闭原则“。

# 适用场景

  • 一个系统不应当依赖于产品实例如何被创建、组合和表达的细节,这对于所有的工厂模式都是很重要,用户无需关系对象的创建过程,将对象的创建与使用解耦。

  • 属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来,同一产品族的产品可以是没有任何关系,但是它们都具有一些共同的约束

  • 产品等级结构稳定,设计完成后,不会向系统中增加新的产品等级结构。

热文推荐

投稿:设计模式之简单工厂模式
投稿:设计模式之工厂方法模式

经验分享:他是如何拿下18家大厂的Offer?(文章有点长)

老王:Netty到底是个什么鬼?有没有简单的理解方式?

本号半年度Java面试题汇总,加薪必备资料。

d00a722227a95ae71a17ef239c9fe4a4.png