工厂方法模式同样是属于类的创建型模式,又被称为多态工厂模式。工厂方法模式是定义一个创建产品对象的工厂接口,实际创建工作由它的子类来完成。核心的工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口。
工厂方法模式包含角色:
1.抽象工厂角色:工厂方法模式的核心,工厂类必须要实现这个接口
2.具体工厂角色:具体工厂类是抽象工厂的一个实现,负责产品对象的实例化
3.抽象角色:工厂方法模式所创建的所有对象的父类,负责描述所有对象所共有的公共接口
4.具体产品角色:工厂方法模式所创建的实例化对象
工厂方法模式和简单工厂模式的区别:
1.工厂方法模式比简单工厂模式多了一个抽象工厂角色,
2.将简单工厂的工厂角色拆分成具体的工厂角色:就是说简单工厂模式就一个工厂角色负责创建所有产品的实例,而工厂方法模式将一个工厂角色拆分成多个具体的工厂角色,每个具体的工厂角色负责创建它们具体的产品实例
3.由上面两点得出:工厂方法模式在有新的产品加入时可以不用再修改具体的工厂角色,而不像简单工厂一样在有新的产品加入时可能要修改工厂角色的代码。
4.工厂方法模式由简单工厂模式升级而来,也可以降级为简单工厂模式
下面来看下工厂方法模式的一种实现代码:
抽象角色--定义所有产品对象的共有公共接口
public interface Flower {
public void open();
}
具体产品角色---实现了抽象角色--接口Flower
public class Chrysanthemum implements Flower {
public void open() {
System.out.println("菊花开了");
}
}
public class Sakura implements Flower {
public void open() {
System.out.println("樱花开了");
}
}
public class Rugosa implements Flower{
public void open() {
System.out.println("玫瑰花开了");
}
}
抽象工厂角色--定义所有工厂类的共有公共接口
public interface FlowerFactory {
public Flower getFlower();
}
具体工厂角色--实现了抽象工厂角色--接口FlowerFactory
public class ChrysanthemunFactory implements FlowerFactory{
public Flower getFlower() {
return new Chrysanthemum();
}
}
public class SakuraFactory implements FlowerFactory {
public Flower getFlower() {
return new Sakura();
}
}
public class RugosaFactory implements FlowerFactory{
public Flower getFlower() {
return new Rugosa();
}
}
测试:
public class FactoryMain {
public static void main(String[] args) {
FlowerFactory rugosaFactory = new RugosaFactory();
Flower rugosa = rugosaFactory.getFlower();
rugosa.open();
FlowerFactory chrysanthemunFactory = new ChrysanthemunFactory();
Flower chrysanthemun = chrysanthemunFactory.getFlower();
chrysanthemun.open();
FlowerFactory sakuraFactory = new SakuraFactory();
Flower sakura = sakuraFactory.getFlower();
sakura.open();
}
}
测试结果: