本文转载自点击打开链接
需求:学习雷锋精神,探望老人。
实现
级别1
使用简单工厂模式实现:
//雷锋 public class LeiFeng { public void sweep() { System.out.println("扫地"); } public void wash() { System.out.println("洗衣"); } public void buyRice() { System.out.println("买米"); } }
//社区志愿者 public class Volunteer extends LeiFeng { }
//学雷锋的大学生 public class Undergraduate extends LeiFeng { }
//简单工厂类 public class SimpleFactory { public static LeiFeng createLeiFeng(String type) { LeiFeng result = null; if ("学雷锋的大学生".equals(type)) { result = new Undergraduate(); } else if ("社区志愿者".equals(type)) { result = new Volunteer(); } return result; } }
//客户端代码 public class Main { public static void main(String[] args) { LeiFeng studentA = SimpleFactory.createLeiFeng("学雷锋的大学生"); studentA.buyRice(); LeiFeng studentB = SimpleFactory.createLeiFeng("学雷锋的大学生"); studentB.sweep(); LeiFeng studentC = SimpleFactory.createLeiFeng("学雷锋的大学生"); studentC.wash(); } }
级别2
使用工厂方法模式实现:
//雷锋工厂 public interface IFactory { LeiFeng createLeiFeng(); }
//学雷锋的大学生工厂 public class UndergraduateFactory implements IFactory { public LeiFeng createLeiFeng() { return new Undergraduate(); } }
//社区志愿者工厂 public class VolunteerFactory implements IFactory { public LeiFeng createLeiFeng() { return new Volunteer(); } }
//客户端代码 public class Main { public static void main(String[] args) { IFactory factory = new UndergraduateFactory(); LeiFeng student = factory.createLeiFeng(); student.buyRice(); student.sweep(); student.wash(); } }
工厂方法使一个类的实例化延迟到其子类。工厂方法模式克服了简单工厂违背开放-封闭原则的缺点,又保持了封闭对象创建过程的优点。它们都是集中封闭了对象的创建,使得要更换对象时,不需要做大的改动就可以实现,降低客户程序与产品对象的耦合。工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。但缺点是由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。