学习编程的同学一定对设计模式这个词不会陌生。其实大多数所谓的设计模式都是前人在编程实践中总结出的精华,类似于上学那会儿老师常说的数学思想等等。所谓兵无常法,只要能达到可扩展性的目的,都可以叫作设计模式。有的人知道设计模试,但不会用,有的人正在实践各设计模式而不自知。好了,进入正题-工厂模式。
什么叫工厂模式?和其他兄弟一样,他是来帮助你解耦的。我们平常创建一个实例经常用new,没媳妇,new一个;没自行车,new一个……可是,现在是一个大分工的时代,我们日常用品不是自己说new就new的,都是从别处买的,是从流水线工厂批量制造出来的。那问题就来了,想像现有一个自行车队,他们的自行车经常换,所以一个很大的需求是不定期的从各厂家批量定制自行车,这该怎么办?总不能一会new一个鸽牌的,一会一个狗牌的吧:
public interface Cycle {
void ride();
}
public class Dovecycle implements Cycle{
@Override
public void ride() {
// TODO Auto-generated method stub
System.out.println("ride a bicycle");
}
}
public class Dogcycle implements Cycle{
@Override
public void ride() {
// TODO Auto-generated method stub
System.out.println("ride a tricycle");
}
}
public class RaceTeam {
private ArrayList<Cycle> cycles = new ArrayList<Cycle>();
public void purchaseCycles(int count){
for(int i = 0; i<count; i++){
Cycle doveCycle = new DoveCycle();
doveCycle.ride();
cycles.add(doveCycle);
}
}
}
多简单啊……嗯,确实想得太简单了。如果我们车队下次不想采购鸽牌的了,而想试试猫牌,狗牌的,你不要告诉我采购的流程不能用了,再重新设计吧。什么?做好的机器砸烂了重做,你以为我铁皮是白送的啊!!!
那现在该怎么办,我该怎么重新设计机器让其更加灵活呢???有了!不如制定个规范,让所有的自行车供应商遵照此规范供货,管他猫牌狗牌的,跟我没关啊:
//嗯,这是我们的要求,无论制造啥车子,按我们的标准来吧
public interface CycleFactory {
Cycle getCycle();
}
//狗牌车公司正式成为供应商
public class DogycleFactory implements CycleFactory {
@Override
public Cycle getCycle() {
// TODO Auto-generated method stub
return new Dogcycle();
}
}
//鸽牌也响应了
public class DovecycleFactory implements CycleFactory{
@Override
public Cycle getCycle() {
// TODO Auto-generated method stub
return new Dovecycle();
}
}
//很好,我们这就可以改造我们的采购流程,并执行分批采购计划
public class RaceTeam {
private ArrayList<Cycle> cycles = new ArrayList<Cycle>();
public void purchaseCycles(CycleFactory factory,int count){
for(int i=0;i<count;i++){
Cycle cycle = factory.getCycle();
cycle.ride();
cycles.add(cycle);
}
}
public static void main(String[] args) {
RaceTeam team = new RaceTeam();
CycleFactory factory1 = new DovecycleFactory();//鸽牌供应商有了
CycleFactory factory2 = new DogycleFactory();//狗牌供应商
team.purchaseCycles(factory1,4);//先来4辆鸽的
team.purchaseCycles(factory2, 3);//再来3辆狗的
team.purchaseCycles(factory1, 2);//鸽的不错,追加2辆
List<Cycle> cycles = team.cycles;//收获满满的
for(int i = 0 ; i < cycles.size();i++){
System.out.println(cycles.get(i));
}
}
}
我们需求量不小,猫牌也想成为我们的长期供应商咋办,不知道,自己看着办吧……