设计模式-工厂模式-工厂方法模式
工厂方法模式简介
工厂方法模式:针对于简单工厂模式,每当需要添加一个新的产品,多需要通知工厂进行维护,添加一条判断,这就违背了java中的开闭原则。工厂方法去掉了简单工厂模式中的静态属性,是的他可以被子类继承这样可以吧不同的对象创建分配到不同的工厂子类中。由此我们也可以猜的出来他的组成结构
工厂方法模式结构
工厂方法的结构:
- 抽象工厂角色:具体工厂类必须实现的父类或接口。它是工厂方法模式的核心。
- 具体工厂角色:是实现了抽象工厂角色的子类,由应用程序调用用于创建对应的具体产品对象。
- 抽象产品角色:是所有产品的父类或接口。
- 具体产品角色:具体工厂角色所创建的对象就是此角色的具体实例。
工厂方法模式代码示例
工厂方法使用多个抽象工厂角色的子类来代替工厂方法中不同的对象创建。这样当有新的产品需要添加。我们只需要实现一个子类,就可以动态扩展,不需要修改已有的代码。废话不多说我们还是已代码示例讲解:
/**
* 水果的抽象接口
*/
public interface Fruit {
void say();
}
/**
* 苹果具体实体类
*/
public class Apple implements Fruit {
public void say(){
System.out.println("我是苹果");
}
}
/**
* 香蕉具体实体类
*/
public class Banana implements Fruit {
public void say(){
System.out.println("我是香蕉");
}
}
/**
* 产生水果的工厂接口
*/
public interface FruitFactory {
Fruit getFruit();
}
/**
* 产出苹果的工厂类(实现了抽象水果工厂的子类)
*/
public class AppleFactory implements FruitFactory {
@Override
public Fruit getFruit() {
return new Apple();
}
}
/**
* 产出香蕉的工厂类(实现了抽象水果工厂的子类)
*/
public class BananaFactory implements FruitFactory {
@Override
public Fruit getFruit() {
return new Banana();
}
}
/**
* 测试入口
*/
public class MainClass {
public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
FruitFactory appleFactory= new AppleFactory();
Fruit apple=appleFactory.getFruit();
apple.say();
FruitFactory bananaFactory= new BananaFactory();
Fruit banana=bananaFactory.getFruit();
banana.say();
}
}
运行结果:
此时如果我们要新添加一个水果橘子,那么我们只要添加橘子的对象和具体的工厂即可如下:
/**
* 橘子具体实体类
*/
public class Orange implements Fruit {
public void say(){
System.out.println("我是橘子");
}
}
/**
* 测试入口
*/
public class MainClass {
public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
FruitFactory appleFactory= new AppleFactory();
Fruit apple=appleFactory.getFruit();
apple.say();
FruitFactory bananaFactory= new BananaFactory();
Fruit banana=bananaFactory.getFruit();
banana.say();
FruitFactory orangeFactory= new OrangeFactory();
Fruit orange=orangeFactory.getFruit();
orange.say();
}
}
运行结果:
小结:
工厂方法模式已经很完美的对对象的创建进行了封装,但是同时也会增加很多工厂子类,那么我们在什么情况下用到工厂方法模式呢:
- 当客户程序不需要知道对象的创建过程。
- 当客户程序使用的对象存在变化的可能,或者根本就不知道使用那一个具体的对象。