Factory and AbstractFactory ——抽象与具体的分离
Factory and AbstractFactory——抽象与具体的分离
面向对象标准关注于抽取一系列事物的共同行为,组建一个基类。行为再划分成两类:
1:现在及以后不太可能会变化的行为。
2:以后可扩展的行为。

图1中,创建产品属于具体行为,类Factory除了创建产品接口外,还包含了一堆抽象特性。Factory应当包含有创建产品这个行为,但不应该指明具体创建哪个产品(产品可以无限制增加,但是创建行为只有一个)。因此,应当把创建产品这个接口保留(对行为的二次抽象),具体创建哪个产品应当由具体Factory类实现。
基于上述分析,得到修改后的图2,如下所示:

图2和图1的区别在于,把Factory提升到抽象类的高度,具体实现由ConcreteFactory实现。这样,以后对产品的扩展中,只需要修改ConcreteFactory类即可,完全不用修改抽象特性。
这种“分而治之”带来的好处,是管理上的清晰便捷,便于代码的维护和扩展。
由于产品特性各有不同(如自行车和糖果),所有产品继承自一个基类不太现实。对图2进行泛化,得到AbstractFactory模式,如图3所示:

图3与图2的差别在于,图3是多重映射关系。图3有多个ConcreteFactory,对应着多组Product。AbstractFactory模式通常由Factory实现。
参考书:C++设计模式,HeadFirst设计模式
Factory and AbstractFactory ——抽象与具体的分离的更多相关文章
- 桥接模式及C++实现 C++设计模式-AbstractFactory抽象工厂模式
桥接模式及C++实现 桥接模式 先说说桥接模式的定义:将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式之一 ...
- AbstractFactory(抽象工厂模式)
AbstractFactory(抽象工厂模式) 有些情况下我们需要根据不同的选择逻辑提供不同的构造工厂,而对于多个工厂而言需要一个统一的抽象 <?php class Config { publi ...
- C++设计模式-AbstractFactory抽象工厂模式
AbstractFactory 要创建一组相关或者相互依赖的对象 作用:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. UML结构图: 抽象基类: 1)AbstractProdu ...
- 设计模式(4)--AbstractFactory(抽象工厂模式)--创建型
1.模式定义: 抽象工厂是应对产品族概念的,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类 2.模式特点: 抽象工厂模式为创建一组对象提供了一种解决方案.与工厂方法模式相比,抽象工 ...
- AbstractFactory抽象工厂模式(创建型模式)
1.new 的问题 常见的对象创建方法: //创建一个Road对象 Road road=new Road(); new的问题:实现依赖,不能应对具体实例的变化 怎么理解上面这句话呢? 可以这样理解:我 ...
- 工厂模式(Factory)和抽象工厂模式(Abstract Factory)
一.工厂模式(Factory):通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的,工厂方法让类的实例化推迟到子类 (1)涉及角色:抽象产品,具体产品,抽象创建者,具体创建者. ...
- AbstractFactory抽象工厂模式
#include <iostream> using namespace std; class ProductAbase { public: ProductAbase(){} virtual ...
- 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)
抽象工厂,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.对于工厂方法来说,抽象工厂可实现一系列产品的生产,抽象工厂更注重产品的组合. 看代码: 7.1.解释 main(),女 ...
- 八、AbstractFactory 抽象工厂模式
设计原理: 代码清单: 抽象 Factory : public abstract class Factory { public static Factory getFactory(String cla ...
随机推荐
- Android常用Permission
位置相关: android.permission.WRITE_GSERVICES 允许程序修改Google服务地图(Allows an application to modify the Google ...
- 多尺度二维离散小波分解wavedec2
对X进行N尺度小波分解 [C,S]=wavedec2(X,N,'wname'); clc,clear all,close all; load woman; [c,s]=wavedec2(X,2,'db ...
- 分页加载的Fragment
package com.z.fragment; import android.os.Bundle; import android.os.Environment; import android.supp ...
- poj 3524 Charm Bracelet(01背包)
Description Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd ...
- javacript没有多维数组只能模拟?
为什么说javacript没有多维数组只能模拟?但是我看到是可以实现多维数组的啊!这是为什么呢?下面我们来实验下. <!DOCTYPE html> <html lang=" ...
- DataTable Javascript Link not working on 2nd page
$(document).ready(function () { var otable = $('#tbl-resources').dataTable( { bJQueryUI: false, bFil ...
- 将网页中的html代码的table保存成word文件
1.后台代码: string nowtime = DateTime.Now.ToString("yyyy-MM-dd"); Response.Clear(); Response.B ...
- 关于perl闭包(个人理解)
我个人理解,就是当一个变量超出作用域时,应是消失了,不见了的,但你还能访问它,这就是闭包. # #看下面的例子. #!/usr/bin/env perl -w use strict; { my $va ...
- 错误记录-spring+mybatis
1.Syntax error on token "String", @ expected 解决:去掉类名后的括号 ps:这错误太二了 2.The nested type UserS ...
- linux手工笔记
一.vi编辑器常用命令: -------------------------------- •插入文字:I键A键 •退回命令模式:ESC •存盘:w •不存盘退出:q •存盘退出:wq •强制退出:q ...