区块链技术博客
www.b2bchain.cn

设计模式_创建型模式_对象创建型模式_Abstract Factory(抽象工厂模式)

这篇文章主要介绍了设计模式_创建型模式_对象创建型模式_Abstract Factory(抽象工厂模式)的讲解,通过具体代码实例进行22632 讲解,并且分析了设计模式_创建型模式_对象创建型模式_Abstract Factory(抽象工厂模式)的详细步骤与相关技巧,需要的朋友可以参考下https://www.b2bchain.cn/?p=22632

本文实例讲述了2、树莓派设置连接WiFi,开启VNC等等的讲解。分享给大家供大家参考文章查询地址https://www.b2bchain.cn/7039.html。具体如下:

前言:主要参考书籍是"Design Patterns"

笔者(我)功力轻薄,肯定会有很多出错的,写得不好的地方,希望各位指正…

文章目录

  • AbStract Factory模式
    • 1:模式名
    • 2:意图
    • 3:别名
    • 4:动机
    • 5:适用性
    • 6:结构
    • 7:参与者
    • 8:协助
    • 9:效果
    • 10:实现
    • 11:代码示例
    • 12:已知应用
    • 13:相关模式

AbStract Factory模式

1:模式名

AbStractFacorty模式,抽象工厂模式 

模式名简介的描述了模式的本质.

2:意图

 提供一个接口以创建一系列相关或者相互依赖的对象 

关键词: 接口,一系列

3:别名

kit 

模式的其他名称

4:动机

例如:要创建一个支持多种视感(类似主题)标准的用户页面工具包, 不同的视感:不同的滚动条,按钮,窗口,等用户界面的"窗口组件" 

用以说明一个设计问题以及如何用模式中的类,对象来解决该问题的特定场景.

5:适用性

  • 一个系统要独立与它的产品的创建,组合和表示.

  • 一个系统要由多个产品系列中的一个来配置

  • 要强调一系列相关的产品对象的设计以便进行联合使用

  • 提供一个产品类库,但只想显示它们的接口而不是实现.

     1:一个系统要独立与它的产品的创建组合表示,如果不是相互独立的,那也就说明一个系统就已经与它所对应的产品绑定在了一起,那样子扩展性能就很差,一个系统只能对应一套产品  2:第二个应该很好理解,可以由客户选择自己想要的一个系列的产品.  3:还是一系列的问题吧.  4:待补充...... 

6:结构

设计模式_创建型模式_对象创建型模式_Abstract Factory(抽象工厂模式)

7:参与者

	1:AbstractFactory	---	声明一个创建抽象产品对象的抽象接口 	2:ConcreteFactory	---	实现创建具体对象的操作 	3:AbstractProduct	---	为一类产品声明一个接口 	4:ConcreteProduct	---	定义一个将被相应的具体工厂所创建的产品对象 						---	实现AbstractProduct接口 	5:Client			---	仅使用AbstractFactory和AbstractProduct类声明的接口 

这里可以举一个小小的例子:


用户想要用电子设备听歌
所以他需要一个手机,(以及能搭配手机用的)耳机
而用户只需要关心的是.
1:找家店买一套设备,
2:用手机来放歌,耳机来听歌,
然后他有两个选择
(1):苹果的手机放歌,Airpods听歌.
(2):小米的手机放歌,小米无线降噪项圈听歌.
然后他就选择了一套方案,然后用手机放歌,用耳机听歌开始享受了.


在这个小例子中,用户就是client,这家店就是AbstractFactory,而小米,苹果就是对应的ConcreteFactory,手机,耳机就是对应的AbstractProduct,而小米手机,耳机,苹果手机,耳机就是对应的Product,用户只需要关心,从哪可以买到一套听歌设备,然后用手机来放歌,耳机来听歌就可以了….(好像,把耳机换成充电器会更好理解..)

8:协助

  • 通常在运行时,创建一个ConcreteFactory类的实例.这一具体的工厂创建具有特定实现的产品对象,为创建不同的产品对象,客户应该使用不同的具体工厂.
  • AbstractFactory将产品对象的创建延迟到它的ConcreteFactory子类

第一个应该很容易理解,用户要用高逼格的手机来放音乐就得选择苹果的工厂来造手机呀! 第二个的意思应该就是,对象的创建是由它的子类(实现类)完成,所以就延期到了它的子类

模式的参与者怎样协助以实现它们的职责

9:效果

  • 优点
          1:它分离了具体的类,AbstractFactory模式帮助你控制一个应用创建对象的类,因为一个工厂封装创建产品对象的责任和过程,它将客户与类的实现分离.客户通过它们的抽象接口操作实例,产品的类名也在具体的工厂的实现中被隔离,即它们不出现在客户代码里.
          2:它使得易于交换产品系列.一个具体工厂类在一个应用仅出现一次—-在它初始化(就是你选择小米还是苹果的时候) ,这使得改变一个应用的具体工厂变得很容易,只需要改变具体的工厂即可使用不同的产品配置.(就好像,不想用苹果了,换个小米吧.)
          3:它有利于产品的一致性
  • 缺点
          1:难以支持新种类的产品
    要理解这一点,可以假设,如果要添加一个无线充电器,然后苹果要根据苹果手机去修改他的工厂类,去实现创建方法,小米,华为,OPPO,VIVO需要这样一个类一个类去修改,就变得很麻烦.

模式怎样支持它的目标?使用模式的效果和所需做的权衡是什么?系统结构的哪些方面可以独立改变?

10:实现

  1. 将工厂作为单件 —- 一个应用一般每个产品系列只需要一个ConcreteFactory的实例
  2. 创建产品 —- AbstractFactory仅声明一个创建产品的接口,真正创建产品是由ConcreteProduct子类实现的,最通常的方法就是为每一个产品定义一个工厂方法,一个具体的工厂将为每个产品重定义该工厂方法以指定产品,虽然这样子的实现很简单,但它却要求每个产品系列都要有一个新的具体子工厂子类,即使这些产品系列的差别真的很小.如果有多个可能的产品系列,具体工厂也可以使用Prototype模式来实现,具体工厂使用产品系列中每一个产品的原型实例来初始化,并通过复制它的原型来创建新的产品,基于原型的方法使得并非每个新的产品系列都需要一个新的具体工厂类.
  3. 定义可扩展的工厂 —- AbstractFotroy通常为每一种它可以生产的产品定义了一个操作(Create)产品的种类被编码在操作型构中,增加一种新的产品要求改变AbstractFactory的接口以及与它相关的类.(严重违反了开闭原则)
    一个更灵活但不太安全的设计是给创建对象的操作增加一个参数,该参数指定了要创建的对象的种类.它可以是一个类标识符,一个整数,一个字符串,或其他任何可以标识产品的东西,

1:一个ConcreteFactory就可以完成对多个同一系列的产品进行创建了,所以就不需要多个ConcreteFactory对象
2:—–暂时没有什么补充的
3:—–暂时不知道怎么补充

实现模式时,需要知道的一些提示,技术要点及应避免的缺陷,以及是否存在默写特定与实现语言的问题.

11:代码示例

结构图
设计模式_创建型模式_对象创建型模式_Abstract Factory(抽象工厂模式)

package Factory;  import product.abstractproduct.EarPhone; import product.abstractproduct.Phone;  /**  * @author ITNTHX  * @create 2020-11-20 22:13  */ public interface AbstractFactory {     public Phone createPhone();     public EarPhone creatEarPhone(); }  
package Factory;  import product.abstractproduct.EarPhone; import product.abstractproduct.Phone; import product.concreteproduct.apple.Airpods; import product.concreteproduct.apple.Iphone;  /**  * @author ITNTHX  * @create 2020-11-20 22:11  */ public class AppleFactory implements AbstractFactory{     @Override     public Phone createPhone() {         return new Iphone();     }      @Override     public EarPhone creatEarPhone() {         return new Airpods();     } }  
package Factory;  import product.abstractproduct.EarPhone; import product.abstractproduct.Phone; import product.concreteproduct.xiaomi.XiaoMiEarPhone; import product.concreteproduct.xiaomi.XiaoMiPhone;  /**  * @author ITNTHX  * @create 2020-11-20 22:03  */ public class XiaomiFactory implements AbstractFactory{     @Override     public Phone createPhone() {         return new XiaoMiPhone();     }      @Override     public EarPhone creatEarPhone() {         return new XiaoMiEarPhone();     } }  
package product.abstractproduct;  /**  * @author ITNTHX  * @create 2020-11-20 22:06  */ public interface EarPhone {     public void sing(); }  
package product.abstractproduct;  /**  * @author ITNTHX  * @create 2020-11-20 22:06  */ public interface Phone {     public void sing(); }  
package product.concreteproduct.apple;  import product.abstractproduct.EarPhone;  /**  * @author ITNTHX  * @create 2020-11-20 22:10  */ public class Airpods implements EarPhone {     @Override     public void sing() {         System.out.println("Today is a good day~");     } }  
package product.concreteproduct.apple;  import product.abstractproduct.Phone;  /**  * @author ITNTHX  * @create 2020-11-20 22:10  */ public class Iphone implements Phone {      @Override     public void sing() {         System.out.println("Siri, 播放好日子~");     } }  
package product.concreteproduct.xiaomi;  import product.abstractproduct.EarPhone; import product.abstractproduct.Phone;  /**  * @author ITNTHX  * @create 2020-11-20 22:08  */ public class XiaoMiEarPhone implements EarPhone {     @Override     public void sing() {         System.out.println("今天是个好日~");     } }  
package product.concreteproduct.xiaomi;  import product.abstractproduct.Phone;  /**  * @author ITNTHX  * @create 2020-11-20 22:07  */ public class XiaoMiPhone implements Phone {     @Override     public void sing() {         System.out.println("小爱同学,播放好日子~");     } }  
import Factory.AbstractFactory; import Factory.AppleFactory; import product.abstractproduct.EarPhone; import product.abstractproduct.Phone;  /**  * @author ITNTHX  * @create 2020-11-20 22:01  */ public class Client {     public static void main(String[] args) {         AbstractFactory abstractFactory = new AppleFactory();         Phone myPhone = abstractFactory.createPhone();         EarPhone myEarPhone = abstractFactory.creatEarPhone();         myPhone.sing();         myEarPhone.sing();     } }  

可以看到运行效果为设计模式_创建型模式_对象创建型模式_Abstract Factory(抽象工厂模式)

用来说明怎样用Java实现该模式的代码片段

12:已知应用

  • Collection类就类似一个抽象工厂.

平时使用时,出现在JDK中的例子

13:相关模式

  • AbstractFactory类通常用工厂方法实现,但他们也可以用Property方法实现
  • 一个具体的工厂通常是一个单件Singleton

与这个模式紧密相关的模式有哪些?其间重要的不同之处是说明?
这个模式应与哪些其他模式一起使用?

本文转自互联网,侵权联系删除设计模式_创建型模式_对象创建型模式_Abstract Factory(抽象工厂模式)

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 设计模式_创建型模式_对象创建型模式_Abstract Factory(抽象工厂模式)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们