第一步:
我们可以新增一个抽象的工厂FruitFactory接口,在该方法中有一个getFruitInstance()方法,然后新增AppleFactory类,BananaFactory类,实现getFruitInstance()方法,返回具体的实例new Apple(),new Banana()
第二步:
这样我们在调用的时候就可以通过工厂实现多态获取具体的工厂,然后通过具体的工厂实例来获取相对应的水果实例
FruitFactory appleFactory = new AppleFactory();
Fruit fruitApple = appleFactory.getFruitInstance();
fruitApple.get();
第三步:
假如我们需要采集新的水果梨子,那么我们只需要新增一个Pear类,然后实现Fruit类,再新增一个PearFactory类,实现FruitFactory接口,返回new Pear(),那么问题就不违反了“开放封闭”原则
代码如下:
Apple.java
复制代码
package com.designpattern.factorymethod;
public class Apple implements Fruit{
public void get(){
System.out.println("采集苹果");
}
}
复制代码
Banana.java
复制代码
package com.designpattern.factorymethod;
public class Banana implements Fruit{
public void get(){
System.out.println("采集香蕉");
}
}
复制代码
Pear.java
复制代码
package com.designpattern.factorymethod;
public class Pear implements Fruit {
@Override
public void get() {
System.out.println("采集梨子");
}
}
复制代码
Fruit.java
package com.designpattern.factorymethod;
public interface Fruit {
public void get();
}
AppleFactory.java
复制代码
package com.designpattern.factorymethod;
public class AppleFactory implements FruitFactory {
@Override
public Fruit getFruitInstance() {
return new Apple();
}
}
复制代码
BananaFactory.java
复制代码
package com.designpattern.factorymethod;
public class BananaFactory implements FruitFactory {
@Override
public Fruit getFruitInstance() {
return new Banana();
}
}
复制代码
PearFactory.java
复制代码
package com.designpattern.factorymethod;
public class PearFactory implements FruitFactory {
@Override
public Fruit getFruitInstance() {
return new Pear();
}
}
复制代码
FruitFactory.java
package com.designpattern.factorymethod;
public interface FruitFactory {
public Fruit getFruitInstance();
}
MainClass.java
复制代码
package com.designpattern.factorymethod;
public class MainClass {
public static void main(String[] args) {
FruitFactory appleFactory = new AppleFactory();
Fruit fruitApple = appleFactory.getFruitInstance();
fruitApple.get();
FruitFactory bananaFactory = new BananaFactory();
Fruit fruitBanana = bananaFactory.getFruitInstance();
fruitBanana.get();
/*
* 此时,如果我再添加新的水果,就只需要添加一个水果类和工厂类,而无需改动其他类就可以实现
*/
FruitFactory pearFactory = new PearFactory();
Fruit fruitPear = pearFactory.getFruitInstance();
fruitPear.get();
}
}
复制代码
一、什么是工厂方法模式
工厂方法模式同样属于类的创建型模式又被称为多态工厂模式 。工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使
系统在不修改具体工厂角色的情况下引进新的产品。
二、工厂方法模式和简单工厂模式比较
工厂方法模式与简单工厂模式在结构上