一、简单工厂模式(静态工厂)
简单工厂模式不属于23种标准设计模式
简单工厂模式是工厂方法模式的一个特殊的实现
简单工厂就是由一个工厂类根据传入的参数决定创建出哪一种产品类的实例
二、实现
产品接口或者抽象类
package factory;/* * 产品接口 */public interface Product { //生产工艺 public void craftwork(); //产品类型 public void type();}
实现的子类
package factory;/* * 鲜奶类 */public class Creamery implements Product { @Override public void craftwork() { System.out.println("牛奶+除菌=鲜奶!"); } @Override public void type() { System.out.println("生产鲜奶!!"); }}
package factory;/* * 酸奶类 */public class Yoghourt implements Product { @Override public void craftwork() { System.out.println("牛奶+酵母菌+粮=酸奶!"); } @Override public void type() { System.out.println("生产了酸奶!"); }}
异常
package factory;/* * 自定义异常 */public class BadException extends Exception { /** * */ private static final long serialVersionUID = 1L; public BadException(String message) { super(message); } }
静态工厂
package factory;/* * 静态工厂 */public class StaticFactory { //根据传入的参数返回不同的产品 public static Product factory(String str) throws BadException{ if(str.equalsIgnoreCase("Creamery")){ System.out.println("========生产鲜奶!========"); return new Creamery(); }else if(str.equalsIgnoreCase("Yoghourt")){ System.out.println("=======生产酸奶!=========="); return new Yoghourt(); }else{ throw new BadException("没有这个产品!"); } }}
测试类
package factory;/* * 测试类 */public class Test { public static void main(String[] args) { try { //通过工厂创建产品也可以使用输入来传值 Product cProduct=StaticFactory.factory("Creamery"); cProduct.craftwork(); cProduct.type(); //通过工厂创建产品也可以使用输入来传值 Product yProduct=StaticFactory.factory("Yoghourt"); yProduct.craftwork(); yProduct.type(); } catch (BadException e) { e.printStackTrace(); } }}
结果:
========生产鲜奶!========牛奶+除菌=鲜奶!生产鲜奶!!=======生产酸奶!==========牛奶+酵母菌+粮=酸奶!生产了酸奶!
三、工厂方法模式--多态性工厂模式
工厂类不再负责所有产品的创建,仅负责给出具体工厂子类必须实现的接口
package factorymethod;/* * 产品接口 */public interface Product { //生产工艺 public void craftwork(); //产品类型 public void type();}
package factorymethod;/* * 鲜奶类 */public class Creamery implements Product { @Override public void craftwork() { System.out.println("牛奶+除菌=鲜奶!"); } @Override public void type() { System.out.println("生产鲜奶!!"); }}
package factorymethod;/* * 酸奶类 */public class Yoghourt implements Product { @Override public void craftwork() { System.out.println("牛奶+酵母菌+粮=酸奶!"); } @Override public void type() { System.out.println("生产了酸奶!"); }}
package factorymethod;import factory.Product;/* * 产品工厂 */public interface ProductFactory { //返回类型为产品接口 public Product factory();}
package factorymethod;import factory.Creamery;import factory.Product;/* * 鲜奶工厂 */public class CreameryFactory implements ProductFactory { @Override public Product factory() { System.out.println("========生产鲜奶!========"); return new Creamery(); }}
package factorymethod;import factory.Product;import factory.Yoghourt;/* * 酸奶工厂 */public class YoghourtFactory implements ProductFactory { @Override public Product factory() { System.out.println("=======生产酸奶!=========="); return new Yoghourt(); }}
测试类
package factorymethod;/* * 工厂方法测试类 */public class Test { public static void main(String[] args) { //创建产品工厂对象并实例化为鲜奶工厂 ProductFactory cf=new CreameryFactory(); cf.factory().craftwork(); cf.factory().type(); //创建产品工厂对象并实例化为酸奶工厂 ProductFactory yf=new CreameryFactory(); //调用产品工厂的方法 yf.factory().craftwork(); yf.factory().type(); }}
结果:
========生产鲜奶!========牛奶+除菌=鲜奶!========生产鲜奶!========生产鲜奶!!========生产鲜奶!========牛奶+除菌=鲜奶!========生产鲜奶!========生产鲜奶!!
如果要添加新新产品,只需要添加新的产品接口子类和产品工厂子类就可以了
完全支持开闭原则