[设计模式C++go]创建型模式:抽象工厂模式

Posted 凌星An

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[设计模式C++go]创建型模式:抽象工厂模式相关的知识,希望对你有一定的参考价值。

抽象工厂模式

介绍

抽象工厂的功能是为一系列 相关对象或相关依赖 的对象创建一个接口

其定义为: Provide an interface for creating families of related or
dependent objectswithout specifying their concrete
classes.(为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。)

主要解决:主要解决接口选择的问题。
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
如何解决: 在一个产品族里面,定义多个产品。
关键代码:在一个工厂里聚合多个同类产品。

类图


AbstractCreator:抽象工厂,定义创建一系列产品对象的操作接口

Creator1、Creator2:具体的工厂,实现抽象工厂定义的方法,具体实现一系列产品对象的创建.

AbstractProductA、AbstractProductB:定义一类产品对象的接口

ProductA1、ProductA2、ProductB1、ProductB2:具体的产品实现对象,通常在具体的工厂里面,会选择具体的产品实现对象,来创建符合抽象工厂定义的方法返回的产品类型的对象.

代码实现

在日常生活中,倘若我们需要组装一台电脑,现在我们简单话,仅需要选择CPU和主板;在选择CPU、主板时,我们要考虑一系列的因素,现在我们只看针脚孔数,只有针脚孔数一致的CPU和主板才能配套使用。客户我们选择的CPU和主板给厂商,厂商组装电脑。但是用户有可能选择的CPU和主板针脚数不同,导致无法安装,故安装好电脑,有用户选择。我们使用代码来完成这个过程.

C++

class CPU
public:
	virtual void calculate() = 0;
protected:
	int _pins ;
;

class IntelCPU :public CPU
public:
	void calculate()
		_pins = 1156;
		std::cout << "Intel  CPU pins:" << _pins << std::endl;
	
;


class AWDCPU :public CPU
public:
	void calculate()
		_pins = 939;
		std::cout << "AWD  CPU pins:" << _pins << std::endl;
	
;

class Board
public:
	virtual void installCPU() = 0;
protected:
	int _pinHoles;
;

class IntelBoard :public Board
public:
	void installCPU()
		_pinHoles = 1156;
		std::cout << "Intel Board _pinHoles:" << _pinHoles << std::endl;
	
;

class AWDBoard :public Board
public:
	void installCPU()
		_pinHoles = 939;
		std::cout << "AWD Board _pinHoles:" << _pinHoles << std::endl;
	
;

class BrandFactory
public:
	virtual CPU* ProduceCPU() = 0;
	virtual Board* ProduceBorad() = 0;

;

class IntelFactory:public BrandFactory
	CPU* ProduceCPU()
		return new IntelCPU;
	
	Board* ProduceBorad()
		return new IntelBoard;
	
;

class AWDFactory :public BrandFactory
	CPU* ProduceCPU()
		return new AWDCPU;
	
	Board* ProduceBorad()
		return new AWDBoard;
	
;

测试:

BrandFactory* bf = new IntelFactory;
	std::cout << "选择CPU和主板" << endl;
	
	CPU* c=bf->ProduceCPU();
	c->calculate();
	Board* b = bf->ProduceBorad();
	b->installCPU();

	BrandFactory* bf1 = new AWDFactory;
	std::cout << "选择CPU和主板" << endl;
	CPU* c1 = bf1->ProduceCPU();
	c1->calculate();
	Board* b1 = bf1->ProduceBorad();
	b1->installCPU();

结果:

选择CPU和主板
Intel CPU pins:1156
Intel Board _pinHoles:1156
选择CPU和主板
AWD CPU pins:939
AWD Board _pinHoles:939

go

package AbstractFactory

import "fmt"

type CPU interface
     Calculate()


type intelCPU struct
     _pins int


func (c *intelCPU)Calculate()
      c._pins=1156
      fmt.Println("Intel CPU pins:",c._pins)

type awdCPU struct
     _pins int


func (c *awdCPU)Calculate()
      c._pins=939
      fmt.Println("AWD CPU pins:",c._pins)


type Board interface
      InstallCPU()



type intelBoard struct
     _pinHoles int


func (c *intelBoard)InstallCPU()
      c._pinHoles=1156
      fmt.Println("Intel Board pinHoles:",c._pinHoles)

type awdBoard struct
    _pinHoles int


func (c *awdBoard)InstallCPU()
      c._pinHoles=939
      fmt.Println("AWD Board pinHoles:",c._pinHoles)


type BrandFactory interface
       ProduceCPU()*CPU
       ProduceBoard()*Board


type IntelFactory struct
       


func (f *IntelFactory)ProduceCPU()CPU
       return &intelCPU
       


func (f *IntelFactory)ProduceBoard()Board
        return &intelBoard
       

type AWDFactory struct



func (f *AWDFactory)ProduceCPU()CPU
       c :=&awdCPU
       return c


func (f *AWDFactory)ProduceBoard()Board
       b :=&awdBoard
       return b


测试

package main

import (
"fmt"
af "AbstractFactory"
)
func main()
   fmt.Println("选择CPU和主板")
   bf :=&af.IntelFactory
   c :=bf.ProduceCPU()
   c.Calculate()
   b :=bf.ProduceBoard()
   b.InstallCPU();
   fmt.Println("选择CPU和主板")
   bf1 :=&af.AWDFactory
   c1 :=bf1.ProduceCPU()
   c1.Calculate()
   b1 :=bf1.ProduceBoard()
   b1.InstallCPU();


结果:

选择CPU和主板
Intel CPU pins: 1156
Intel Board pinHoles: 1156
选择CPU和主板
AWD CPU pins: 939
AWD Board pinHoles: 939

优缺点:

优点:
1.分离接口和实现
使用抽象工厂来创建需要的对象,而不知道具体的实现是谁,只是面向产品的接口编程.
2.切换产品簇变得容易
选用不同的工厂实现,就相当于在切换不同的产品簇
缺点:
1.不太容易扩展新的产品
倘若我们需要增加一个产品,显示器;那么我们需要修改BrandFactory的代码
产品族难扩展,产品等级易扩展。
2.容易造成层次复杂
抽象工厂的实现很需要分出层次来,没一层负责一种选择,也就是一层屏蔽一种变化

与其他设计模式的联想

抽象工厂模式和工厂模式

工厂模式一般是针对单独的产品对象的创建,而抽象工厂模式注重产品簇对象的创建,这是它们的区别

如果把抽象创建的产品簇简化,这个产品簇只有一个产品的话,这时候,抽象工厂和工厂方法是差不多的。

以上是关于[设计模式C++go]创建型模式:抽象工厂模式的主要内容,如果未能解决你的问题,请参考以下文章

[设计模式C++go]创建型模式:抽象工厂模式

[设计模式C++go]创建型模式:工厂模式

[设计模式C++go]创建型模式:工厂模式

创建型模式 抽象工厂

设计模式之抽象工厂模式(创建型)

创建型设计模式——抽象工厂模式