设计模式学习总结1 - 创建型1 - Abstract Factory抽象工厂模式

AbstractFactory抽象工厂模式(创建型

作用:

这种模式支持创建不同的对象,这些对象功能接近且一般都是在一起创建的。抽象工厂被具体化成不同的工厂来创建类似产品的不同产品。这种模式将类于使用的客户端分离以便通过工厂来创建。这样,各类产品可以方便的变化而不需要改变使用者的结构。

Role
This pattern supports the creation of products that exist in families and are designed to be produced together. The abstract factory can be refined to concrete factories,each of which can create different products of different types and in different combinations. The pattern isolates the product definitions and their class names from the client so that the only way to get one of them is through a factory. For this reason, product families can easily be interchanged or updated without upsetting the structure of the client.

设计:

抽象工厂接口IAbstractFactory,含有创建各类抽象产品abstract products的操作;

工厂1Factory1, 工厂2Factory2,实现了抽象工厂接口IAbstractFactory的创建产品的操作;

抽象产品接口IProductA,IProductB,含有某类产品自有的操作;

具体产品ProductA1, ProductA2, ProductB1, ProductB2,实现了抽象产品接口的具体产品类,这些具体产品类由相应的工厂生产;

举例:

AbstractFactory     生产一种钢笔
FactoryA               英雄钢笔厂
FactoryB               永生钢笔厂
AbstractProduct     钢笔产品
ProductA1             英雄金笔
ProductB1             永生金笔

ProductA2             英雄软笔
ProductB2             永生软笔
代码: 

ExpandedBlockStart.gif代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AbstractFactory
{
    
//抽象工厂
    abstract class AbstractFactory
    {
        
abstract public AbstractWheel CreatWheel();
        
abstract public AbstractOilBox CreatOilBox();
    }


    
abstract class AbstractWheel
    {
        
public AbstractWheel()
        {
            
//Console.Write("Create a AbstractProduct");
        }
    }

    
abstract class AbstractOilBox
    {
        
public AbstractOilBox()
        { }
    }


    
class BMWFactory : AbstractFactory
    {
        
public override AbstractWheel CreatWheel()
        {
            
return new BMWWheel();
        }

        
public override AbstractOilBox CreatOilBox()
        {
            
return new BMWOilBox();
        }
    }

    
class BMWWheel : AbstractWheel
    {
        
public BMWWheel()
        {
            Console.WriteLine(
"Create a BMWwheel");
        }
    }

    
class BMWOilBox : AbstractOilBox
    {
        
public BMWOilBox()
        {
            Console.WriteLine(
"Create a BMWOilBox");
        }
    }

    
class BORAWheel:AbstractWheel
     {
      
public BORAWheel()
      {
       Console.Write(
"Create a BORAWheel");
      }
     }

     
class BORAOilBox:AbstractOilBox
     {
      
public BORAOilBox()
      {
       Console.Write(
"Create a BORAOilBox");
      }
     }
         
     
class BORAFactory:AbstractFactory
     {
      
public override AbstractWheel CreatWheel()
      {
       
return new BORAWheel();
      }

      
public override AbstractOilBox CreatOilBox()
      {
       
return new BORAOilBox();
      }

     }


    
    
class Program
    {
        
static void Main(string[] args)
        {
            AbstractFactory factory 
= null;
            factory 
= new BORAFactory();
            factory.CreatWheel();
            factory.CreatOilBox();
            Console.ReadLine();

            factory 
= new BMWFactory();
            factory.CreatWheel();
            factory.CreatOilBox();
            Console.ReadLine();
        }
    }
}

 

 使用场景:

1、系统不依赖他要使用对象的创建、组成、表示
2、系统需要配置使用多组对象
3、创建对象和工厂必须是强制使用的
4、重点是要暴露接口而不是实现

Use the Abstract Factory pattern when…
•  A system should be independent of how its products are created, composed, and represented.
•  A system can be configured with one of multiple families of products.
•  The constraint requiring products from the same factory to be used together must be enforced.
•  The emphasis is on revealing interfaces, not implementations.

总结:

      抽象工厂模式是一种创建型模式,目的是解决实例化对象时所带来的问题。在现实中系统总是需要变化来实例化不同的对象,因此封装“创建操作”到抽象工厂,由具体的工厂来实例相应的对象。抽象工厂模式面向接口,将实例化对象的操作封装起来,不同的工厂都实现实例对象的操作。
      在系统中,经常会遇到“一组相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。面对这种问题,避免使用常规的对象创建方法,使用“封装实例华对象”来避免系统和这种“多系列具体对象创建工作”的紧耦合。
      在需求稳定。系统基本无变化的情况下松耦合和紧耦合是没有区别的,但是需求的变化,要求在某些方面将系统"解耦",抽象工厂就是将对象的实例化和系统解耦。
     《设计模式》:提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定他们的具体类。Abstract Factory模式的几个要点:
     1、如果没有应对“多系列对象构建”的需求变化,则没有必要使用Abstract Factory模式。
     2、“系列对象”指的是这项对象之间有相互依赖、或作用的关系。
     3、Abstract Factory模式主要在于应对“新系列”的需求变动。缺点是难以应对“新对象”的需求变动。这一点应该注意,就像前面说的,如果我们现在要在加入其他系列的类,代码的改动会很大。
     4、Abstract Factory模式经常和Factory Method模式共同组合来应对“对象创建”的需求变化。

转载于:https://www.cnblogs.com/utopia/archive/2010/02/28/1675216.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277002.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT练习9 Dialog学习

http://files.cnblogs.com/hnrainll/dialog.zip 源代码下载转载于:https://www.cnblogs.com/hnrainll/archive/2011/05/30/2063135.html

C#中NULL,,DBNULL,String.Empty,Convert.IsDBNull()的区别

C#中的空值的判断较麻烦,不象在VB6中那么简单,这些各种空值的判断和理解对不熟悉的人来说,可能很麻烦,现就我在使用过程中的一点体会和大家共同分享。 (1)NULL null 关键字是表示不引用任何对象的空引用的文字值。null 是引用类型…

关于初始化C++类成员

转自:http://www.vckbase.com/document/viewdoc/?id584 在使用C编程的过程当中,常常需要对类成员进行初始化,通常的方法有两种: 第一种方法: CMYClass::CSomeClass() {x0;y1; } 第二种方法: CSomeClass::CSomeClass…

ASP.NET 2.0 中的新增服务、控件与功能概述(四)

原文出自http://blog.sina.com.cn/s/blog_48b6cd65010004fc.html个性化 另一个新增的服务是个性化,它提供了一种现成的解决方案,用于解决存储站点用户的个性化设置问题。目前,此类设置通常存储在Cookie、后端数据库或这两者中。无论这些设置存…

C/C++ 交换两个数,不使用第三个变量, 函数模板来实现

#include <iostream>template<typename T> void exchangeTwoNumber(T &t1, T &t2)&#xff1b;void test();int main() {int a 10, b 20;double q 10.1, w 20.2;char z z, x x;std::cout << "交换前的 a " << a << &qu…

Oracle错误集!

个人使用Oracle时出现的错误&#xff0c;在这里记下来&#xff0c;加深印象。 1、ORA-20000: ORU-10027: buffer overflow, limit of 2000 bytes 今天写存储过程时&#xff0c;使用dbms_output.put_line(result:||i||---||documentID);输出测试结果。当我设置其输出记录较多…

[原+转]CSS hack 小技巧 让你的CSS 兼容ff ie6.0 ie7.0

在做东西的时候发现在ie6.0中做的东西到ff下面目全非100% css不兼容不问题 查阅了相关资料 个人感觉以下是一个笨的也是比较快的处理兼容问题的方法方法就是针对不同的浏览器写不同的css 以前用!important 但是ie7 和ff 就不好分了个人感觉比较好的方法是 samplepadding:0px; …

准备试用svn

用了VSS2005感觉一般&#xff0c;准备试用svn&#xff01;&#xff01;&#xff01;转载于:https://www.cnblogs.com/jessenee/archive/2008/03/31/1131027.html

web功底之强,实属罕见。。

不看不知道&#xff0c;一看汗得死你了。。纯用html做的。不多说&#xff0c;看看就知道了&#xff0c;http://www.kanqq.com/qq/smilies/ku.htm 以人格保证&#xff0c;不是病毒网页。。。 转载于:https://www.cnblogs.com/lsgoodsun/archive/2007/11/04/949222.html

第三次作业-Scrum

理解&#xff1a; 首先&#xff0c;敏捷并不是一门具体的技术&#xff0c;而是一种理念或者说是一种思想。它可以指导我们更加高效的开发。其次&#xff0c;敏捷开发都具有以下共同的特征&#xff1a; 1.迭代式开发2. 增量交付 3. 开发团队和用户反馈推动产品开发 4. …

如何处理错误消息Please install the gcc make perl packages

2019独角兽企业重金招聘Python工程师标准>>> 如何处理这行错误消息&#xff1f; Please install the gcc make perl packages from your distribution。 执行命令行&#xff1a;yum install gcc perl make 输出&#xff1a; Loaded plugins: product-id, search-dis…

iOS开发 CGAffineTransform 让图片旋转, 旋转后获得图片旋转的角度

1.让图片旋转 UIImageView *imageView [[UIImageView alloc]init]; imageView.frame CGRectMake(50, 50, 200, 200); imageView.image [UIImage imageNamed:"460.jpg"]; CGAffineTransform transform CGAffineTransformMakeRotation(M_PI*0.38); imageView.tr…

致毕业生:那些年我们错过的“BAT”

本文旨在用最通俗的语言讲述最枯燥的基本知识最近看到公众号中各种推“招聘季金九银十铜十二”之类的文章&#xff0c;把毕业季找工作需要应对的事情和解决方法都已经写的很详细了&#xff0c;还有各种面经考经挥之即来&#xff0c;已经没必要再去写这样的一个文章了&#xff0…

PHP函数收藏---不断更新中!

替换html标签 function strip_bad_tags($html) { $s preg_replace ("?[^>]*>*", "", $html); return $s; } 替换指定tag,$text是需要替换的文本,tags 是需要替换标签的数组 function strip_selected_tags($text, $tags array()) { $args func_ge…

gcc 5.2.0 手动更新(亲测)

注意:(不要在gcc-5.2.0 源码目录中执行 configure&#xff0c;否则会报错)安装操作如下&#xff1a;0、yum 安装 gcc yum -y install gcc gcc-c libstdc libstdc-devel autoconf makegcc-5.2.0 下载地址&#xff1a;ftp://gcc.gnu.org/pub/gcc/releases/gcc-5.2.0/gcc-5.2.0…

Lie to me不错

最近Fox的新剧有个Lie to me不错&#xff0c;如果你腻了了没完没了的Lost&#xff0c;觉得Hero开始离谱了&#xff0c;Prison Break只能重看第一季了&#xff0c;怀念Friends的经典又不忍心再看第10遍的话&#xff0c;这个剧是个不错的选择。 看了一集了&#xff0c;每个人平均…

NLog 简单使用

1.安装NLog 使其集成到VS 里 下载地址&#xff1a; http://nlog-project.org/ 2.NLog.config <?xml version"1.0" encoding"utf-8" ?> <nlog xmlns"http://www.nlog-project.org/schemas/NLog.xsd"xmlns:xsi"http://www.w3.or…

10.31T2 点双联通分量+预处理前缀+二分答案

2.逛公园I (parka) 【问题描述】 琥珀色黄昏像糖在很美的远方&#xff0c;思念跟影子在傍晚一起被拉长…… 小 B 带着 GF 去逛公园&#xff0c;公园一共有 n 个景点&#xff0c;标号为 1 . . . n。景点之间有 m 条路径相连。 小 B 想选择编号在一段区间 [l, r] 内的…

SQL学习笔记之存储过程的编写

今天写几个存储过程&#xff0c;觉得有这个必要记录下来&#xff0c;方便以后忘了也好有个备份&#xff0c;都很简单&#xff0c;高手可以不用看的。一、记录的插入--region [dbo].[InsertArchive]--------------------------------------------------------------------------…

应用安全-操作系统安全-漏洞修复整理

FTP弱密码 将FTP服务器的密码更改为强密码 vi /etc/vsftpd/vsftpd.conf anonymous_enableNO #禁止匿名登录 重启ftp服务 Windows匿名用户整改参考&#xff1a; https://www.jb51.net/article/135347.htm View CodeSSH弱密码 修改ssh配置文件&#xff1a; 1.修改iptables 首先要…