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

94 阅读2分钟

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

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

工厂模式是什么?为什么要用工厂模式?

工厂模式就是用来创建对象,即new一个对象。那么一般而言,我们直接A a = new A()即可,当然工厂创建一个简单的对象也是这样做的。

但是,如果在创建A对象的时候,要对对象A进行初始化怎么办?第一想法就是构造函数传参,在构造函数里进行一些操作。不过,这样写代码可能会十分丑陋,比如传参过多等等。每次new一个对象,都要带长长的参数,然后可能new的前后再来些操作,代码极其冗余。此时,就可以使用工厂模式,直接获取一个对象,获取对象的方法由工厂提供。

工厂模式涉及哪些角色

  • 抽象工厂Creator:工厂接口,提供get产品方法。
  • 具体工厂Concrete Creator:具体的工厂类,实现抽象工厂接口的方法,new具体的产品。当然new的是具体产品,返回的是对象的超类型,即抽象产品。
  • 抽象产品Product:产品接口/类。
  • 具体产品Concrete Product:实现抽象产品,用来被new。

factory.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 SportsAssociation {
    /**
     * 注册运动员
     * @return
     */
    public Player register();
}

具体工厂:篮球协会

public class BasketballAssociation implements SportsAssociation{
    @Override
    public Player register() {
        return new BasketballPlayer();
    }
}

具体工厂:足球协会

public class FootballAssociation implements SportsAssociation{
    @Override
    public Player register() {
        return new FootballPlayer();
    }
}

现在足球俱乐部要招队员了。当然俱乐部你要不要再整个接口,就随你自己了。这里的足球俱乐部只是我为了用工厂创建对象而已。

public class FootballClub {
    public Player player1;
    public Player player2;

    /**
     * 测试。使用工厂(体育协会)生产角色(运动员)
     */
    public void init() {
        SportsAssociation sportsAssociation = new FootballAssociation();
        this.player1 = sportsAssociation.register();
        this.player2 = sportsAssociation.register();
    }
}

代码

github.com/RadishVeget…