设计模式--Abstract Factory抽象工厂模式

本文通过世界杯外围赛中不同国家队的组建为例,详细介绍了抽象工厂模式的设计思路与实现过程。包括抽象产品、抽象工厂、具体产品、具体工厂及客户端应用等核心组件的定义与交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  有这样一种场景:世界杯外围赛,有资格参加比赛的国家都会派出自己的球队。我们可以将每个国家的球队看成是一组系列化的对象,因为在这一支球队中,有领 队,教练,球员等角色,每一种角色都是一类对象。而每个国家派出的球队都有这些固定的角色。但不同的球队这些角色的具体对象又不一样。
  这就是抽象工厂适用的情景:提供一个创建一系列(上面的一个球队就是一个系列)相关或相互依赖对象(球队中的领队,教练,球员之间就是相关和相互依赖的关系)的接口,而无需指定它们具体的类(指不用直接定义和创建每一个具体的球队)。所以,它针对的的产品系列的情况。
  下面,我们就来实现抽象工厂。
  程序如下图:
                          
  抽象工厂的参考者,也就是该模式中的各个类或对象之间的关系:

 

抽象产品(Abstract Product):为这一系列的某一种产品声明接口 
抽象工厂(Abstract Factory):声明生成一系列抽象产品的方法 
具体产品(Product):定义具体工厂生成的具体产品的对象,实现产品接口 
具体工厂(Concrete Factory):执行生成一系列抽象产品的方法,生成一系列具体的产品 
客户(Client):我们的应用程序客户端(不要理解成人),使用抽象产品和抽象工厂生成对象。 

 一、定义抽象产品类,这里我们定义了球队各成员的抽象产品类AbstractTeam

using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;

namespace  MyAbstractFactory
ExpandedBlockStart.gifContractedBlock.gif
{
   
// 定义产品系列中的各个抽象产品角色,其作用是为这一系列的各种产品声明接口 
    
//在本例就是定义一个球队(产品系列)中的各个成员(各种产品)角色的声明接口

ContractedSubBlock.gifExpandedSubBlockStart.gif    
定义领队--抽象产品类 定义领队--抽象产品类
   
public  abstract class Leader
ExpandedSubBlockStart.gifContractedSubBlock.gif   
{
       
public abstract void LeaderWorkMethod(); //领队的工作方式
   }

    
#endregion


ContractedSubBlock.gifExpandedSubBlockStart.gif    
定义教练--抽象产品类  定义教练--抽象产品类
   
public  abstract  class  Coach
ExpandedSubBlockStart.gifContractedSubBlock.gif   
{
       
public abstract void CoachWorkMethod(); //教练的工作方式
   }

    
#endregion

ContractedSubBlock.gifExpandedSubBlockStart.gif    
定义球员--抽象产品类  定义球员--抽象产品类
   
public  abstract  class  Players
ExpandedSubBlockStart.gifContractedSubBlock.gif   
{
       
public abstract void PlayerWorkMethod(); //球员的工作方式
   }

    
#endregion

}

 二、定义抽象工厂类,这里我们定义了球队的抽象工厂类AbstractCreateTeamFactory


using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;

namespace  MyAbstractFactory
{
    
//  抽象工厂(Abstract Factory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。它负责声明生成一系列抽象产品的方法 

    
// 本例就是负责声明生成球队这个系列中各个抽象产品(其内的领队,教练和球员)的方法

   
public  abstract    class  AbstractCreateTeamFactory
    {
        
public  abstract  Leader  CreateLeader();  // 生成领队的方法
         public  abstract  Coach CreateCoach();  // 生成教练的方法
         public  abstract  Players CreatePlayer(); // 生成球员的方法
    }
}

 三、定义具体产品类,这里我们定义了中国队ChinaTeam和澳大利亚队AustraliaTeam两个队

中国队ChinaTeam

using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;

namespace  MyAbstractFactory
ExpandedBlockStart.gifContractedBlock.gif
{
   
// 具体产品(Product)定义具体工厂生成的具体产品的对象,实现产品接口 
   
// 这里定义了中国队这个具体系列中的各个成员(领队,教练,球员)的具体产品对象并实现对应抽象类的接口。

ContractedSubBlock.gifExpandedSubBlockStart.gif    
定义领队--抽象类 定义领队--抽象类
    
public  class ChinaLeader:Leader 
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public override  void LeaderWorkMethod(){} //中国队领队的工作方式
    }

    
#endregion


ContractedSubBlock.gifExpandedSubBlockStart.gif    
定义教练--抽象类  定义教练--抽象类
    
public  class  ChinaCoach:Coach 
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public override void CoachWorkMethod() { } //中国队教练的工作方式
    }

    
#endregion

ContractedSubBlock.gifExpandedSubBlockStart.gif    
定义球员--抽象类  定义球员--抽象类
    
public  class  ChinaPlayer:Players
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public override void PlayerWorkMethod() { } //中国队球员的工作方式
    }

    
#endregion
}

澳大利亚队AustraliaTeam

using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;

namespace  MyAbstractFactory
ExpandedBlockStart.gifContractedBlock.gif
{
    
// 具体产品(Product)定义具体工厂生成的具体产品的对象,实现产品接口 
    
// 这里定义了澳大利亚队这个具体系列中的各个成员(领队,教练,球员)的具体产品对象并实现对应抽象类的接口。

ContractedSubBlock.gifExpandedSubBlockStart.gif    
定义领队--抽象类 定义领队--抽象类
    
public class AustraliaLeader : Leader
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public override void LeaderWorkMethod() { } //澳大利亚队领队的工作方式
    }

    
#endregion


ContractedSubBlock.gifExpandedSubBlockStart.gif    
定义教练--抽象类  定义教练--抽象类
    
public  class  AustraliaCoach : Coach
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public override void CoachWorkMethod() { } //澳大利亚队教练的工作方式
    }

    
#endregion

ContractedSubBlock.gifExpandedSubBlockStart.gif    
定义球员--抽象类  定义球员--抽象类
    
public  class  AustraliaPlayer : Players
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public override void PlayerWorkMethod() { } //澳大利亚队球员的工作方式
    }

    
#endregion
}

 四、定义具体工厂类,这里我们定义了中国队具体工厂ChinaTeamFactory和澳大利亚队具体工AustraliaTeamFactory厂
中国队ChinaTeamFactory

using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;

namespace  MyAbstractFactory
ExpandedBlockStart.gifContractedBlock.gif
{
    
class ChinaTeamFactory:AbstractCreateTeamFactory
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
ContractedSubBlock.gifExpandedSubBlockStart.gif        
生成领队的方法 生成领队的方法
        
public override  Leader CreateLeader()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Console.WriteLine(
"生成中国队领队");
            
return new ChinaLeader();

        }

        
#endregion

ContractedSubBlock.gifExpandedSubBlockStart.gif        
生成教练的方法 生成教练的方法
        
public override Coach CreateCoach()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Console.WriteLine(
"生成中国队教练");
            
return new ChinaCoach();
        }

        
#endregion
 

ContractedSubBlock.gifExpandedSubBlockStart.gif        
生成球员的方法  生成球员的方法
        
public  override  Players CreatePlayer()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Console.WriteLine(
"生成中国队球员");
            
return new ChinaPlayer();
        }

        
#endregion

    }


}

澳大利亚队AustraliaTeamFactory

using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;

namespace  MyAbstractFactory
ExpandedBlockStart.gifContractedBlock.gif
{
    
class AustraliaTeamFactory:AbstractCreateTeamFactory 
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
ContractedSubBlock.gifExpandedSubBlockStart.gif        
生成领队的方法 生成领队的方法
        
public override Leader CreateLeader()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Console.WriteLine(
"生成澳大利亚领队");
            
return new AustraliaLeader();
        }

        
#endregion

ContractedSubBlock.gifExpandedSubBlockStart.gif        
生成教练的方法 生成教练的方法
        
public override Coach CreateCoach()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Console.WriteLine(
"生成澳大利亚教练");
            
return new AustraliaCoach();
        }

        
#endregion


ContractedSubBlock.gifExpandedSubBlockStart.gif        
生成球员的方法  生成球员的方法
        
public  override  Players CreatePlayer()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Console.WriteLine(
"生成澳大利亚球员");
            
return new AustraliaPlayer();
        }

        
#endregion
    }

}

 五、TeamsCreater

using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;

namespace  MyAbstractFactory
ExpandedBlockStart.gifContractedBlock.gif
{
    
class TeamsCreater
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        AbstractCreateTeamFactory   teamCreatureFactory;  
// 
        Leader  leader;
        Coach  coach;
        Players player;

        
public  TeamsCreater()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
        }


        
public TeamsCreater(AbstractCreateTeamFactory pteamCreatureFactory)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
this.teamCreatureFactory = pteamCreatureFactory;
        }


        
public void FormTeamsCreature()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            Console.WriteLine(
"现在生成的球队各成员分别是:");
            leader 
= teamCreatureFactory.CreateLeader();
            coach 
= teamCreatureFactory.CreateCoach();
            player 
= teamCreatureFactory.CreatePlayer();
        }

    }

}

 

 六、客户端应用抽象工厂

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MyAbstractFactory
ExpandedBlockStart.gifContractedBlock.gif
{
    
class Program
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
static void Main(string[] args)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{

            
//我们的应用程序客户端(不要理解成人),使用抽象产品和抽象工厂生成对象。 

ContractedSubBlock.gifExpandedSubBlockStart.gif            
生成中国球队 生成中国球队
            AbstractCreateTeamFactory teamfactory 
= (AbstractCreateTeamFactory)new ChinaTeamFactory();
            TeamsCreater tc 
= new TeamsCreater(teamfactory);

            tc.FormTeamsCreature();
            
#endregion


ContractedSubBlock.gifExpandedSubBlockStart.gif            
生成澳大利亚球队 生成澳大利亚球队
            teamfactory 
= (AbstractCreateTeamFactory)new AustraliaTeamFactory();
            tc 
= new TeamsCreater(teamfactory);
            tc.FormTeamsCreature();
            Console.Read();
            
#endregion

        }

    }

}

 运行效果如下:
                        

前往:设计模式学习笔记清单

转载于:https://www.cnblogs.com/smallfa/archive/2009/10/21/1587518.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值