1.引入:
由于简单工厂模式的缺点:创建的类完全依赖于工厂类,违反开闭原则。意思就是工厂类不能写死了,写死不容易程序扩展。
如果需要去工厂取斧头,采用简单工厂模式,实际就是把斧头的类型写死,但是如果用户要来个你们工厂没有的类型的斧头,那么就得把斧头的制造(具体产品),工厂类都修改。这样不方便。所以工厂方法模式就是解决这个问题,相对于简单工厂模式,需要从工厂类下手,通过接口和多个实现类的方式,把工厂类写的灵活。
如果不了解简单工厂模式,可以看这个简单工厂模式(java版)
2.工厂方法模式的实现:
--2.1提供制造斧头的接口(抽象产品):
//实现制造斧头的接口
public interface Axe {
//制造
public void make();
}
--2.2通过实现制造斧头的接口来制造出一把斧头(具体产品):
public class SteelAxe implements Axe{
@Override
public void make() {
// TODO Auto-generated method stub
System.out.println("制造出来了钢斧!");
}
}
public class StoneAxe implements Axe{
@Override
public void make() {
// TODO Auto-generated method stub
System.out.println("制造出来了石斧!");
}
}
public class WoodenAxe implements Axe{
@Override
public void make() {
// TODO Auto-generated method stub
System.out.println("制造出来了木斧!");
}
}
--2.3.斧头提供给工厂的接口(抽象工厂)
public interface Provider {
public Axe provide();
}
--2.4工厂通过实现接口,来根据用户的需要提供斧头(具体工厂)
public class SteelAxeFactory implements Provider{
@Override
public Axe provide() {
// 创建钢斧
return new SteelAxe();
}
}
class StoneAxeFactory implements Provider{
@Override
public Axe provide() {
// 创建石斧
return new StoneAxe();
}
}
class WoodenAxeFactory implements Provider{
@Override
public Axe provide() {
//创建木斧
return new WoodenAxe();
}
}
2.5测试类:
public class AxeTest {
public static void main(String[] args) {
Provider provider=new SteelAxeFactory();
Axe axe=provider.provide();
axe.make();
}
}
运行结果:
制造出来了钢斧!
-------------------------------------------------------------
3.总结:
这样如果用户需要金斧,就只需要定义一个具体产品GoldenAxe类并实现Axe接口,再定义一个GoldenAxeFactory类并实现Provider接口就完事了,其他的都不需要修改。扩展性提高。