简单工厂是真的简单,如果我们有N个类需要被工厂管理,那我们给N个类分配一个唯一标识,调用工厂方法需要传递标识,工厂根据传入的标识创建对象。这种做法的缺点很明显,扩展性太差!严重违反开闭原则。如果要是又新增M个类需要被工厂管理,那么还要去改工厂类代码。
package simplefactory_k;/* * @auther 顶风少年 * @mail dfsn19970313@foxmail.com * @date 2020-01-15 10:45 * @notify * @version 1.0 */ public class Airplane { }
package simplefactory_k;/* * @auther 顶风少年 * @mail dfsn19970313@foxmail.com * @date 2020-01-15 10:46 * @notify * @version 1.0 */ public class Rocket { }
package simplefactory_k;/* * @auther 顶风少年 * @mail dfsn19970313@foxmail.com * @date 2020-01-15 10:46 * @notify * @version 1.0 */ public class Screw { }
package simplefactory_k; /* * @auther 顶风少年 * @mail dfsn19970313@foxmail.com * @date 2020-01-15 10:46 * @notify * @version 1.0 */ public class SimpleFactoryK { public static Object getObject(String obj) { if (obj.equals("飞机")) { return new Airplane(); } else if (obj.equals("火箭")) { return new Rocket(); } else if (obj.equals("螺丝")) { return new Screw(); } else { return null; } } }
package simplefactory_k; /* * @auther 顶风少年 * @mail dfsn19970313@foxmail.com * @date 2020-01-15 10:53 * @notify * @version 1.0 */ public class Main { public static void main(String[] args) { Object airplane = SimpleFactoryK.getObject("飞机"); System.out.println(airplane instanceof Airplane); Object rocket = SimpleFactoryK.getObject("火箭"); System.out.println(rocket instanceof Rocket); Object screw = SimpleFactoryK.getObject("螺丝"); System.out.println(screw instanceof Screw); } }
工厂方法弥补了简单工厂不易于扩展的缺点,给一个产品族定义一个接口,产品族下边定义具体的产品实现。(产品族的纵向的,接口和实现类,或者抽象类和子类)创建产品族工厂接口,不同的产品工厂创建不同的产品。苹果和香蕉都是都是水果族,苹果工厂生产苹果,香蕉工厂生产香蕉,而他们属于水果工厂。当我们需要增加另外一种水果,例如橘子,需要我们创建一个橘子类,和一个橘子类的工厂,这听起来好像又麻烦了许多。但是我们假设,创建一个类需要很多的参数,整体的创建需要写很多的代码。那创建一个工厂类是完全有必要的。
package factorymethod_k;/* * @auther 顶风少年 * @mail dfsn19970313@foxmail.com * @date 2020-01-15 14:22 * @notify * @version 1.0 */ public interface Fruiter { void product(); }
package factorymethod_k;/* * @auther 顶风少年 * @mail dfsn19970313@foxmail.com * @date 2020-01-15 14:24 * @notify * @version 1.0 */ public class Apple implements Fruiter { @Override public void product() { System.out.println("种出苹果"); } }
package factorymethod_k;/* * @auther 顶风少年 * @mail dfsn19970313@foxmail.com * @date 2020-01-15 14:24 * @notify * @version 1.0 */ public class Banana implements Fruiter { @Override public void product() { System.out.println("种出香蕉"); } }
package factorymethod_k;/* * @auther 顶风少年 * @mail dfsn19970313@foxmail.com * @date 2020-01-15 14:25 * @notify * @version 1.0 */ public interface Farm { Fruiter getBean(); }
package factorymethod_k;/* * @auther 顶风少年 * @mail dfsn19970313@foxmail.com * @date 2020-01-15 14:26 * @notify * @version 1.0 */ import factoryMethod.Fruit; public class AppleFarm implements Farm{ @Override public Fruiter getBean() { return new Apple(); } }
package factorymethod_k;/* * @auther 顶风少年 * @mail dfsn19970313@foxmail.com * @date 2020-01-15 14:26 * @notify * @version 1.0 */ public class BananaFarm implements Farm{ @Override public Fruiter getBean() { return new Banana(); } }
package factorymethod_k;/* * @auther 顶风少年 * @mail dfsn19970313@foxmail.com * @date 2020-01-15 14:29 * @notify * @version 1.0 */ public class Client { public static void main(String[] args) { Farm farm = new AppleFarm(); Fruiter fruiter = farm.getBean(); Farm farm2 = new BananaFarm(); Fruiter fruiter2 = farm2.getBean(); System.out.println(fruiter instanceof Apple); System.out.println(fruiter2 instanceof Banana); } }
原文:https://www.cnblogs.com/zumengjie/p/12195598.html