工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。 (完全符合开闭原则,解决了简单工厂方法模式添加新的类需要去修改原有的类)
结构与角色
Factory:抽象工厂。工厂方法模式的核心,声明工厂方法,返回一个产品。在任何情况下创建对象的工厂类必须继承当前的接口。
ConcreteFactory:具体工厂。实现抽象工厂接口的具体java类,实现了工厂方法,含有与应用密切相关的逻辑,有客户调用返回一个产品实例。
Product:抽象产品,定义产品接口。工厂方法模式所创建的对象的父类型,产品抽象共同拥有的接口。
ConcreteProduct:具体产品。实现抽象产品角色接口的类,工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。
情景
家兴是一个非常喜欢打篮球游戏的屌丝,同时是一个IT男,最近公司让它开发一些投篮的一些类,但是要求是不能违背开闭原则,以后更改其它代码,因此家兴想到工厂方法模式;
打篮球触发行为动作,其实都是那一瞬间的肌肉记忆反应的,但是在游戏中,它是主要通过人为控制来实现,这样我们通过Mind接口来替代Factory,同时ShotTechnology接口代替Product。同时家兴如果再需要填加新的投篮技术,只需要通过继承MInd和ShotTechnology这两个接口来实现,就可以实现这一技术,只需要在客户端进行调用。如添加抛投等等
工厂方法模式xml图
//接口类
public interface Mind {
public ShotTechnology mind();
}
public interface ShotTechnology {
}
//继承Mind接口
public class DryPickMind implements Mind {
public ShotTechnology mind(){
return new DryPick();
}
}
public class ScramMind implements Mind {
public ShotTechnology mind(){
return new Scram();
}
}
//继承ShotTechnology接口
public class DryPick implements ShotTechnology{
public DryPick(){
System.out.println("我家兴要使用干拔,我看你们谁能拦我。");
}
}
public class Scram implements ShotTechnology{
public Scram(){
System.out.println("我家兴要使用急停,你还没反应,呵呵。");
}
}