设计模式学习总结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,一经查实,立即删除!

相关文章

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

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

第三次作业-Scrum

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

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

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

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

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

gcc 5.2.0 手动更新(亲测)

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

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

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

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

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

Java自定义JSlider UI

Java自定义JSlider UI JSlider作为Swing中提供的滑标组件, 以图形方式在有界区间内通过移动滑块来选择值,滑块可以显示主刻度标记和次刻度标记。大量应用于如播放器中的音量设定等领域中。但是JSlider本身提供的UI样式很单调,不足以满足用户的…

Chrome OS 云里雾里

昨天Google发布了ChromeOS,之前有牛人编译了它的源码并创建了虚拟机分享出来。具体的BT种子不记得了,有需要的可以搜索一下chromeos-image-999.999.32309.211410-a1.vmdk.bz2。看看哪还有种子可用。文件大概287M左右,解压后大概7、8百M。当下…

二叉树的遍历方式

2019独角兽企业重金招聘Python工程师标准>>> 二叉树遍历方式有三种:前序遍历,中序遍历,后序遍历(其实还有一个层序遍历) 使用两种方式来实现三种遍历: 1. 使用递归的方式实现 1)&…

非常恶俗地分享一首歌曲(子陵·周郎顾)

歌词 [hjp3]hjptypesong&player5&filehttp://file.hjbbs.com/ayi/share/mp3/zhoulanggu.mp3&backColor990000&frontColorddddff&autoStarttrue&showDownloadtrue&width310&height20[/hjp3]子陵周郎顾 绿绮轻拂刹那玄冰破, 九霄仙音…

that is why用法

释义:这就是为什么,因此 Thats why I was getting married. ---《老友记》 第一季 第一集 这就是我为什么结婚的原因。 例句: Mr. Gorbachev, on the other hand, recognized that his sluggish and authoritarian bureaucracy was the worst…

阿里云超算集谛优化GPU异构并行性能:GROMACS

“集谛”是一款内置于阿里云弹性高性能计算(Elastic High Performance Computing,E-HPC)的云上性能监控与分析引擎,支持集群资源利用情况的实时监控和用户作业运行情况的在线分析。对于采用GPU加速的异构计算应用场景,“集谛”除了监控节点ho…

MySQl看这一篇就够了

MySQl看这一篇就够了 MySQL分享 一、数据库结构 语句 DDL(Data Definition Languages):数据定义语句,常用的语句关键字主要包括 create、drop、alter等操作表结构 DML(Data Manipulation Language)&#xf…

IDEA 实用功能Auto Import:自动优化导包(自动删除、导入包)

JetBrains公司的intellij Idea堪称JAVA编程界的苹果,用户体验非常好 下面介绍一下IDEA的一个能显著提升写代码效率的非常好用的功能设置—— Auto Import Auto Import的功能是可以帮助我们自动删除无用的包Import(未被引用),以及自动Import填充尚未导入的…

怎么看网站是否被黑防止网站被黑

2019独角兽企业重金招聘Python工程师标准>>> 网站被黑,打开网站竟然跳转到博cai网站上去了,一开始以为自己看错了,多次从百度点击自己网站进去,还是会跳转到彩piao网站上,第一反应是自己的网站被黑了&#…

c#事务的使用、示例及注意事项

一、事务的介绍.NET Framework 开发员指南事务是一组组合成逻辑工作单元的操作,虽然系统中可能会出错,但事务将控制和维护事务中每个操作的一致性和完整性。例如,在将资金从一个帐户转移到另一个帐户的银行应用中,一个帐户将一定的…

Nginx学习系列二Linux下Nginx实现负载均衡

关于在本地虚拟机(VMware 14)下安装Linux同时安装Nginx,请参考Nginx学习系列之搭建环境 1、启动Nginx 在Nginx安装成功的前提下,启动Nginx 已root模式登陆(权限需要),接着找到Nginx的安装目录,启动Nginx,并且指定Nginx启动所需的配置文件,该文件也在Nginx的安装目录下. 2、查看…

设计模式初学者系列-策略模式 -------为什么总是继承

设计模式初学者系列-策略模式 -------为什么总是继承 模板方法的延续 这篇稿子是基于我的前一篇模板方法设计模式之上演绎的,如果没有阅读请点击这里查看,以了解这篇稿子的上下文。 在模板方法设计模式里我举了一个例子:教育部…

红米airdots掉了怎么查找_红米K30 Pro 荣耀V30pro 这两款手机该怎么选呢?

点击?玩机数码君?关注我,加★星标★你好 我是岁月神偷昨天可以说是小米拍手称快的一天,红米K30 Pro以2999的超低价成为目前最便宜的骁龙865旗舰,让友商拍马难追。友商明眼人都知道说的华为,怎么感觉小米每次发布会也替华为宣传了…