创建型模式----抽象工厂模式

126 阅读2分钟

创建型模式----抽象工厂模式

参考《大话设计模式》和一些网络资源。如有纰漏,请多指正。

在说抽象工厂模式之前,先了解产品等级和产品族的概念

产品等级和产品族

产品等级:即产品的继承结构。比如运动员这个抽象类,里面有篮球运动员、足球运动员、羽毛球运动员等。产品等级结构对应的就是工厂模式

产品族:产品族指一个同一个工厂生产,生产了位于不同产品等级的一组产品。比如篮球协会生产篮球运动员、篮球教练、篮球等等,足球协会生产足球运动员、足球教练、足球等等。工厂里包含了多个不同产品等级的产品。那么生产产品族的就是抽象工厂模式。

产品族.png

abstractfactory.png

简单例子:

一个足球俱乐部要创建几个足球运动员,和足球教练。这里足球教练和足球运动员就属于产品族。

首先这里有运动员,包含篮球运动员、足球运动员等等。

又有体育协会,所有运动员都要在体育协会注册(即通过体育协会创建运动员),体育协会有篮球协会(创建篮球运动员)、足球协会(创建足球运动员)。

抽象产品:运动员

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();
    }
}

代码

github.com/RadishVeget…