设计模式-抽象工厂总结
*要学习某个设计模式,首先要了解该设计模式是为了解决一个什么样的问题,
在现实中应用场景是什么,才能达到事半功倍的效果。 --Sepmay*
在添加链接描述上一篇文章中,介绍了工厂方法,对工厂方法的理念,解决的问题,以及现实中的应用都作了讲解。 之前提到的工厂方法是为了解决这样的问题,在软件系统中,经常面临着创建对象的工作,由于需求的不断变化,需要创建的对象的具体类型也会经常产生变化。
那么抽象工厂是为了解决什么问题?它与工厂方法有什么联系和区别是什么呢?
问题:在软件系统中,经常面临着需要创建“一系列相互依赖的对象”,同时,由于需求的变化,可能需要创建另一组相互依赖的对象,所以往往存在多系列对象的创建工作。
接下来进入一个案例:
假设一个工厂需要生产三种产品A,B,C,每个产品都要经过三个流程,分别为design(设计),process(加工),assemble(组装),并且每个产品的三个流程都不相同。
根据题意我们得创建三个流程对象,分别为design对象,process对象,assemble对象,每个对象中实现相应的方法,并且根据不同的产品,需要创建相应的流程对象,A得创建属于A的design,process和assemble对象,以此类推所以说三个流程之间是相互依赖的,不能A的design之后进行属于B的process流程,这样与实际情况不符合,明显是错误的。按照工厂模式的方法,大家可以尝试下,写是可以完成的,但是代码重复性也较高,较为繁琐。
抽象工厂的方法,是将有一系列依赖关系的对象抽象成一个类,通过一个类进行管理,避免了错误并且简单利落。接下来看代码:
class Design{public:virtual void Designing() = 0;virtual ~Design() {}
};class Process {public:virtual void Processing() = 0;virtual ~Process() {}
};
class Assemble {public:virtual void Assembling() = 0;virtual ~Assemble() {}
};class AbstractFactory{public:virtual Design* Creatdesign () = 0;virtual Process* Creatprocess () =0;virtual Assemble* Creatassemble () =0;virtual ~AbstractFactory () {}
};//A
class Adesign : public Design{ virtual void Designing() {cout<<"Designing A..."<<endl;}
};class Aprocess : public Process{virtual void Processing(){cout<<"Processing A..."<<endl;}
};class Aassemble : public Assemble{virtual void Assembling(){cout<<"Assembling A...\n"<<endl;}
};class AFactory : public AbstractFactory{virtual Design* Creatdesign () { return new Adesign();}virtual Process* Creatprocess () { return new Aprocess();}virtual Assemble* Creatassemble (){ return new Aassemble();}
};//B
class Bdesign : public Design{ virtual void Designing() {cout<<"Designing B..."<<endl;}
};class Bprocess : public Process{virtual void Processing(){cout<<"Processing B..."<<endl;}
};class Bassemble : public Assemble{virtual void Assembling(){cout<<"Assembling B...\n"<<endl;}
};class BFactory : public AbstractFactory{virtual Design* Creatdesign () { return new Bdesign();}virtual Process* Creatprocess () { return new Bprocess();}virtual Assemble* Creatassemble (){ return new Bassemble();}
};//C
class Cdesign : public Design{ virtual void Designing() {cout<<"Designing C..."<<endl;}
};class Cprocess : public Process{virtual void Processing(){cout<<"Processing C..."<<endl;}
};class Cassemble : public Assemble{virtual void Assembling(){cout<<"Assembling C...\n"<<endl;}
};class CFactory : public AbstractFactory{virtual Design* Creatdesign () { return new Cdesign();}virtual Process* Creatprocess () { return new Cprocess();}virtual Assemble* Creatassemble (){ return new Cassemble();}
};class Employee{private:AbstractFactory* fac;
public:Employee(AbstractFactory* fac){this->fac = fac;}void Result (){Design* des = fac->Creatdesign();Process* pro = fac->Creatprocess();Assemble* ass = fac->Creatassemble();des->Designing();pro->Processing();ass->Assembling();}
};int main()
{Employee worker1 = Employee(new AFactory());Employee worker2 = Employee(new BFactory());Employee worker3 = Employee(new CFactory());worker1.Result();worker2.Result();worker3.Result();return 0;
}
从上面的程序可以看出,当我们添加一个产品D的工作线非常容易,只需要根据接口再写一个符合D的操作流程即可,所以说拓展起来非常容易。但是可以发现,这种方法对产品的操作方法要求较高,需要它们的流程,操作方法一致,并且再添加更改某个对象会较复杂。
优点是确实解决了一系列依赖对象的创建问题,复用性也较高。
每个设计模式都不可避免的有它使用的场景,有它的缺点和优点,如果期望每个地方都可以更改,那每个设计模式都实现不了,如果每一点都不要求更改,那我们也就用不着设计模式。设计模式重要的是它的可变与不可变的部分,使得可变的部分实现设计的要求,尽可能让更多的部分不变,我觉得这是设计模式的闪光点。
总结:若没有应对“多系列对象构建”的需求,那么运用简单的工厂方法就行,没有必要使用Abstract Method。“系列对象”指的是一系列下的对象之间相互依赖作用,不同系列的对象不能相互依赖。抽象工厂模式优点主要在于应对“新系列”的需求变动。 缺点是难以应对“新对象”的需求变动。
设计模式-抽象工厂总结相关推荐
- 创建设计模式 - 抽象工厂设计模式
创建设计模式 - 抽象工厂设计模式 欢迎来到java示例中的Abstract Factory Design Pattern.摘要工厂设计模式是创造模式之一.抽象工厂模式几乎类似于工厂模式,除了它更像工 ...
- 系统架构技能之设计模式-抽象工厂模式
一.上篇回顾 上篇我们主要讲述了简单工厂模式和工厂模式.并且分析了每种模式的应用场景和一些优缺点,我们现在来回顾一下: 简单工厂模式:一个工厂负责所有类型对象的创建,不支持无缝的新增新的类型对象的创建 ...
- 常见设计模式—抽象工厂模式
设计模式-抽象工厂模式 1.什么是抽象工厂模式 抽象工厂模式是围绕一个超级工厂创建其它工厂,是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品. 2.角色分 ...
- 【JAVA进阶系列】JAVA 设计模式 -- 抽象工厂模式(Abstract Factory)
[JAVA进阶系列]JAVA 设计模式 -- 抽象工厂模式(Abstract Factory) [1.1]抽象工厂模式简介 抽象工厂者模式的类结构图 AbstractProduct(抽象产品),Abs ...
- java设计模式---抽象工厂模式
工厂模式在项目中是常常用到的,有人说只有大项目才会用到,小项目是体会不出来.其实使用设计模式与项目的大小没有实质性的联系.设计模式是经验的总结而不是衡量项目大小的标准. 以开发项目的DAO层为例,在项 ...
- C++设计模式--抽象工厂模式
前言 前面有两篇文章分别介绍了简单工厂模式和工厂方法模式,这两种模式都比较常见,今天介绍工厂模式的最后一种,抽象工厂模式. 抽象工厂模式(Abstract Factory Pattern)是所有形态的 ...
- python工厂模式 理解_浅谈Python设计模式 - 抽象工厂模式
声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在上一篇我们对工厂模式中的普通工厂模式有了一定的了解,其实抽象工作就是 表示针对 ...
- 05设计模式——抽象工厂模式
前言:以下总结来自龙哥---左潇龙博客. 总结的很到位,附上博客链接:http://www.cnblogs.com/zuoxiaolong/p/pattern6.html 抽象工厂模式算是工厂相关模式 ...
- [设计模式] ------ 抽象工厂模式
抽象工厂模式 抽象工厂模式,就是对工厂方法模式加以改进而已,其实就是用简单工厂模式的套路创建各个工厂,后面和工厂模式就一模一样了. 其实就是相当于将创建哪个工厂的权利再次放给调用端. 调用端在调用的时 ...
- C++设计模式-抽象工厂模式
目录 基本概念 代码与实例 基本概念 抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,从而无需指定他们具体的类. 抽象工厂的好处: 1. 易于交换产品系列 ...
最新文章
- HDOJ 1874 HDU 1874 畅通工程续 ACM 1874 IN HDU
- 使用jQuery.Ajax向ASP.NET MVC控制器Post数据
- hough变换是如何检测出直线和圆的
- date、sleep和usleep命令
- mysql数据库表中的类型_MySQL数据库中表类型MyISAM与InnoDB的区别
- 【转】细说.NET中的多线程 (三 使用Task)
- cheaklist 人机交互界面_10个人机交互系统及界面的设计方案
- MySQL给查询结果添加一表表示行号或名次(1)
- jQuery:实现排他
- 计算机word求差函数,表格里怎么自动求差/怎样在word2010表格中求差
- Incapsula到底是什么
- 朱松纯教授:可解释性是人工智能获得人类信任的关键
- 安装了多个java 如何切换java版本
- AliOS Things
- 在js中Date对象用getDay方法get到的是个啥玩意儿?
- Python:什么叫自定义模块?
- g第十四周,十五周作业
- 使用Dash快速构建你的数据可视化前端
- android自定义大括弧
- 在markdown中控制文字的颜色,背景色,字体大小,字体样式及颜色RGB转换工具链接