创建型模式----抽象工厂模式
参考《大话设计模式》和一些网络资源。如有纰漏,请多指正。
在说抽象工厂模式之前,先了解产品等级和产品族的概念
产品等级和产品族
产品等级:即产品的继承结构。比如运动员这个抽象类,里面有篮球运动员、足球运动员、羽毛球运动员等。产品等级结构对应的就是工厂模式
产品族:产品族指一个同一个工厂生产,生产了位于不同产品等级的一组产品。比如篮球协会生产篮球运动员、篮球教练、篮球等等,足球协会生产足球运动员、足球教练、足球等等。工厂里包含了多个不同产品等级的产品。那么生产产品族的就是抽象工厂模式。
简单例子:
一个足球俱乐部要创建几个足球运动员,和足球教练。这里足球教练和足球运动员就属于产品族。
首先这里有运动员,包含篮球运动员、足球运动员等等。
又有体育协会,所有运动员都要在体育协会注册(即通过体育协会创建运动员),体育协会有篮球协会(创建篮球运动员)、足球协会(创建足球运动员)。
抽象产品:运动员
public interface Player {
public void run();
public void jump();
}
具体产品:足球运动员
public class FootballPlayer implements Player{
@Override
public void run() {
System.out.println("FootballPlayer run!!");
}
@Override
public void jump() {
System.out.println("FootballPlayer jump!!");
}
}
具体产品:篮球运动员
public class BasketballPlayer implements Player{
@Override
public void run() {
System.out.println("BasketballPlayer run!!");
}
@Override
public void jump() {
System.out.println("BasketballPlayer jump!!");
}
}
抽象产品:教练
public interface Coach {
public void training();
}
具体产品:足球教练
public class FootballCoach implements Coach{
@Override
public void training() {
System.out.println("FootballCoach training");
}
}
具体产品:篮球教练
public class BasketballCoach implements Coach{
@Override
public void training() {
System.out.println("BasketballCoach training");
}
}
抽象工厂:体育协会。这里加了注册教练
public interface SportsAssociation {
/**
* 注册运动员
* @return
*/
public Player registerPlayer();
/**
* 注册教练
* @return
*/
public Coach registerCoach();
}
具体工厂:篮球协会
public class BasketballAssociation implements SportsAssociation {
@Override
public Player registerPlayer() {
return new BasketballPlayer();
}
@Override
public Coach registerCoach() {
return new BasketballCoach();
}
}
具体工厂:足球协会
public class FootballAssociation implements SportsAssociation {
@Override
public Player registerPlayer() {
return new FootballPlayer();
}
@Override
public Coach registerCoach() {
return new FootballCoach();
}
}
现在足球俱乐部要招队员和教练了。
public class FootballClub {
public Player player1;
public Player player2;
public Coach coach1;
/**
* 测试。使用工厂(体育协会)生产角色(运动员)
*/
public void init() {
SportsAssociation sportsAssociation = new FootballAssociation();
this.player1 = sportsAssociation.registerPlayer();
this.player2 = sportsAssociation.registerPlayer();
this.coach1 = sportsAssociation.registerCoach();
}
}
代码