创建型模式----工厂模式
参考《大话设计模式》和一些网络资源,如有纰漏,请多指正。
工厂模式是什么?为什么要用工厂模式?
工厂模式就是用来创建对象,即new一个对象。那么一般而言,我们直接A a = new A()即可,当然工厂创建一个简单的对象也是这样做的。
但是,如果在创建A对象的时候,要对对象A进行初始化怎么办?第一想法就是构造函数传参,在构造函数里进行一些操作。不过,这样写代码可能会十分丑陋,比如传参过多等等。每次new一个对象,都要带长长的参数,然后可能new的前后再来些操作,代码极其冗余。此时,就可以使用工厂模式,直接获取一个对象,获取对象的方法由工厂提供。
工厂模式涉及哪些角色
- 抽象工厂Creator:工厂接口,提供get产品方法。
- 具体工厂Concrete Creator:具体的工厂类,实现抽象工厂接口的方法,new具体的产品。当然new的是具体产品,返回的是对象的超类型,即抽象产品。
- 抽象产品Product:产品接口/类。
- 具体产品Concrete Product:实现抽象产品,用来被new。
简单例子:
一个足球俱乐部要创建几个足球运动员。
首先这里有运动员,包含篮球运动员、足球运动员等等。
又有体育协会,所有运动员都要在体育协会注册(即通过体育协会创建运动员),体育协会有篮球协会(创建篮球运动员)、足球协会(创建足球运动员)。
抽象产品:运动员
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();
}
}
代码