简单工厂模式与工厂方法模式的区别:简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,取出了与具体产品的依赖。计算器案例中,只需把+给工厂,工厂就给出了相应的实例,客户端只要去做运算就可以了,添加一个新运算,就需要修改修改原有的类,违反了开放封闭原则。
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
将一个简单工厂模式的工厂类变成了一个工厂抽象接口和多个具体生成对象的工厂,于是增加新操作时,就不需要更改原有工厂类,只需要增加此功能的运算类和相应的工厂类就可以了。
这样整个工厂和产品体系其实都没有修改的变化,而只是扩展的变化,完全符合开放封闭原则。将简单工厂的内部逻辑判断移到了客户端代码来进行。
package Factory; public class MainClass { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub LeiFeng xueLeiFeng = new Undergraduate(); xueLeiFeng.BuyRice(); xueLeiFeng.Sweep(); xueLeiFeng.Wash(); simpleFactory(); factory(); } private static void factory() { IFactory factory = new UndergraduateFactory(); LeiFeng student = factory.CreateLeiFeng(); student.BuyRice(); student.Sweep(); student.Wash(); } private static void simpleFactory() { LeiFeng studentA = SimpleFactory.CreateLeiFeng("学雷锋的大学生"); studentA.BuyRice(); LeiFeng studentB = SimpleFactory.CreateLeiFeng("学雷锋的大学生"); studentB.Sweep(); LeiFeng studentC = SimpleFactory.CreateLeiFeng("学雷锋的大学生"); studentC.Wash(); } } class LeiFeng { public void Sweep() { System.out.println("sweep the floor"); } public void Wash() { System.out.println("wash clothes"); } public void BuyRice() { System.out.println("buy rice"); } } class Undergraduate extends LeiFeng {} class Volunteer extends LeiFeng {} class SimpleFactory { public static LeiFeng CreateLeiFeng(String type) { LeiFeng result = null; switch (type) { case "学雷锋的大学生": result = new Undergraduate(); break; case "社区志愿者": result = new Volunteer(); break; } return result; } } interface IFactory { LeiFeng CreateLeiFeng(); } class UndergraduateFactory implements IFactory { @Override public LeiFeng CreateLeiFeng() { return new Undergraduate(); } } class VolueteerFactory implements IFactory { @Override public LeiFeng CreateLeiFeng() { return new Volunteer(); } }
工厂方法模式简言之,创建一个工厂接口,各个工厂实现该工厂,用各个具体工厂生成对象。