上一次讲了简单工厂模式,我们可以做的其不满足OCP原则,下面引入工厂方法模式
结构图如下:
1.产品类
package com.sf.entity;
import com.sf.jk.Fruit;
public class Apple implements Fruit {
public Apple(){
System.out.println("生产水果");
}
public void eat() {
System.out.println("苹果可以吃");
}
public void plant() {
// TODO Auto-generated method stub
System.out.println("苹果可以种");
}
public void sell() {
// TODO Auto-generated method stub
System.out.println("苹果可以卖");
}
}
package com.sf.entity;
import com.sf.jk.Fruit;
public class Banana implements Fruit{
public Banana(){
System.out.println("生产香蕉");
}
public void eat() {
// TODO Auto-generated method stub
System.out.println("香蕉可以吃");
}
public void plant() {
// TODO Auto-generated method stub
System.out.println("香蕉可以种");
}
public void sell() {
// TODO Auto-generated method stub
System.out.println("香蕉可以卖");
}
}
2.产品的抽象接口
package com.sf.jk;
public interface Fruit {
public void eat();
public void plant();
public void sell();
}
3.工厂的抽象接口
package com.sf.jk;
public interface CreateFactory {
public Fruit createFruit();
}
4.工厂的具体实现方法
package com.sf.hf;
import com.sf.entity.Apple;
import com.sf.jk.CreateFactory;
import com.sf.jk.Fruit;
public class CreateApple implements CreateFactory{
public Fruit createFruit() {
// TODO Auto-generated method stub
return new Apple();
}
}
package com.sf.hf;
import com.sf.entity.Banana;
import com.sf.jk.CreateFactory;
import com.sf.jk.Fruit;
public class CreateBanana implements CreateFactory{
public Fruit createFruit() {
// TODO Auto-generated method stub
return new Banana();
}
}
5.客户端调用
import com.sf.hf.CreateApple;
import com.sf.hf.CreateBanana;
import com.sf.hf.FruitFactory;
import com.sf.jk.CreateFactory;
import com.sf.jk.Fruit;
public class Test {
private static CreateFactory cf1,cf2;
private static Fruit fruit;
public static void main(String[] args) {
System.out.println("---------创建苹果---------");
cf1 = new CreateApple();
fruit = cf1.createFruit();
fruit.eat();
fruit.plant();
System.out.println("---------创建香蕉---------");
cf2 = new CreateBanana();
fruit = cf2.createFruit();
fruit.eat();
fruit.plant();
}
}
6.运行结果
---------创建苹果---------
生产水果
苹果可以吃
苹果可以种
---------创建香蕉---------
生产香蕉
香蕉可以吃
香蕉可以种
简单工厂模式与工厂方法的简单比较:
我们可以看出,工厂方法满足ocp原则,及对扩展开放,对修改关闭。
在工厂方法模式中,工厂被抽象成一个接口,具体的生产产品的实例化操作放在了其子类或者实现该几口的具体方法中,
当客户端可以根据不同的需求调用不同的实现方法,及生产产品的方法。