设计模式之工厂模式
工厂模式是一种常用的实例化对象的设计模式,它用工厂方法代替了实例化对象时的new操作。工厂模式主要分为三种,分别是简单工厂,工厂方法和抽象工厂。我们来一一介绍。
假定工厂生产的产品需要一个统一的接口如下:
package 工厂模式; /** * 统一的产品接口 */ public interface Product { public String ProStandard(); }
1.简单工厂
package 工厂模式; /** * 简单工厂 * 定义一个产品接口Product * 然后定义实现Porduct接口的三个产品实现类,Washer,IceBox,AirCondithon * 在SimpleFactory类里,直接生产相应的产品 */ public class SimpleFactory { /** * 根据传递的产品名称来生产产品 * @param productName * @return * @throws Exception */ static Product createProduct(String productName) throws Exception{ if("Washer".equals(productName)){ return new Washer(); }else if("IceBox".equals(productName)){ return new IceBox(); }else if("AirCondition".equals(productName)){ return new AirCondition(); }else{ throw new Exception("没有该产品!"); } } /** * 入口函数 * @param args */ public static void main(String[] args) { //生产三种产品 try { createProduct("Washer"); //如果输错产品名称,会导致无法生产 // createProduct("Washer1"); createProduct("IceBox"); createProduct("AirCondition"); //生产暂时没有的产品时,需要再创建相应的产品实现类,而且要多出修改 // createProduct("Television"); } catch (Exception e) { e.printStackTrace(); } } } /** * 洗衣机 * @author Administrator * */ class Washer implements Product{ /** * 实例化时就生产洗衣机 */ public Washer() { System.out.println(ProStandard()+"洗衣机生产了!"); } @Override public String ProStandard() { return "==符合"+this.getClass().getSimpleName()+"产品标准---"; } } /** * 冰箱 */ class IceBox implements Product{ /** * 实例化时就生产冰箱 */ public IceBox(){ System.out.println(ProStandard()+"冰箱生产了!"); } @Override public String ProStandard() { return "==符合"+this.getClass().getSimpleName()+"产品标准---"; } } /** * 空调 */ class AirCondition implements Product{ /** * 实例化时就生产空调 */ public AirCondition(){ System.out.println(ProStandard()+"空调生产了!"); } @Override public String ProStandard() { return "==符合"+this.getClass().getSimpleName()+"产品标准---"; } }
上述代码执行后,控制台打印如下:
==符合Washer产品标准---洗衣机生产了! ==符合IceBox产品标准---冰箱生产了! ==符合AirCondition产品标准---空调生产了!
简单工厂存在高耦合的情况,如果产品的生产计划更改,需要在源代码中更改,不符合面向对象中的“向继承开放,向修改关闭”的原则。
2.工厂方法
package 工厂模式; /** * 定义一个统一的工厂接口 */ public interface Factory { public String facStandard(); //public Product createProduct(); } --------------------------------------------------------- package 工厂模式; /** * 工厂方法 * 声明实现Factory接口的三个工厂类,分别生产洗衣机,冰箱,空调 * 这些工厂实现类里均有生产产品的方法 */ public class FactoyMethod { //程序入口方法 public static void main(String[] args) { new WasherFactory().createProduct(); new IceBoxFactory().createProduct(); new AirConditionFactory().createProduct(); } } /** * 洗衣机厂 */ class WasherFactory implements Factory{ @Override public String facStandard() { return "***符合"+this.getClass().getSimpleName()+"工厂标准---"; } // @Override public Product createProduct() { System.out.println(facStandard()); return new Washer(); } } /** * 冰箱厂 */ class IceBoxFactory implements Factory{ @Override public String facStandard() { return "***符合"+this.getClass().getSimpleName()+"工厂标准---"; } // @Override public Product createProduct() { System.out.println(facStandard()); return new IceBox(); } } /** * 空调厂 */ class AirConditionFactory implements Factory{ @Override public String facStandard() { return "***符合"+this.getClass().getSimpleName()+"工厂标准---"; } // @Override public Product createProduct() { System.out.println(facStandard()); return new AirCondition(); } }
上述代码执行后,控制台打印如下:
***符合WasherFactory工厂标准--- ==符合Washer产品标准---洗衣机生产了! ***符合IceBoxFactory工厂标准--- ==符合IceBox产品标准---冰箱生产了! ***符合AirConditionFactory工厂标准--- ==符合AirCondition产品标准---空调生产了!
工厂方法可以通过某些专业的工厂来生产特定产品,在解耦合方面比简单工厂有很大的进步。但是,在面临更为复杂的生产形势,尤其是产品线更为庞大时,就要采用抽象工厂了。
3.抽象工厂
package 工厂模式; /** * 抽象工厂 * 便于产品分类 */ public class AbstractFactory { public static void main(String[] args) { new WasherFactory_A_Depart().createProduct(); new WasherFactory_B_Depart().createProduct(); new IceBoxFactory_A_Depart().createProduct(); new IceBoxFactory_B_Depart().createProduct(); new AirConditionFactory_A_Depart().createProduct(); new AirConditionFactory_B_Depart().createProduct(); } } /** * 洗衣机产品 */ abstract class WasherAbstract implements Product { } /** * 洗衣机产品A系列 */ class Washer_A extends WasherAbstract{ public Washer_A(){ System.out.println(this.toString()); } @Override public String ProStandard() { return "==符合"+this.getClass().getSimpleName()+"产品标准---"; } @Override public String toString() { return ProStandard()+this.getClass().getSimpleName()+"生产了!"; } } /** * 洗衣机产品B系列 */ class Washer_B extends WasherAbstract{ public Washer_B(){ System.out.println(this.toString()); } @Override public String ProStandard() { return "==符合"+this.getClass().getSimpleName()+"产品标准---"; } @Override public String toString() { return ProStandard()+this.getClass().getSimpleName()+"生产了!"; } } /** * 冰箱产品 */ abstract class IceBoxAbstract implements Product{} /** * 冰箱产品A系列 */ class IceBox_A extends IceBoxAbstract{ public IceBox_A(){ System.out.println(this.toString()); } @Override public String ProStandard() { return "==符合"+this.getClass().getSimpleName()+"产品标准---"; } @Override public String toString() { return ProStandard()+this.getClass().getSimpleName()+"生产了!"; } } /** * 冰箱产品B系列 */ class IceBox_B extends IceBoxAbstract{ public IceBox_B(){ System.out.println(this.toString()); } @Override public String ProStandard() { return "==符合"+this.getClass().getSimpleName()+"产品标准---"; } @Override public String toString() { return ProStandard()+this.getClass().getSimpleName()+"生产了!"; } } /** * 空调产品 */ abstract class AirConditionAbstract implements Product{} /** * 空调产品A系列 */ class AirCondition_A extends AirConditionAbstract{ public AirCondition_A(){ System.out.println(this.toString()); } @Override public String ProStandard() { return "==符合"+this.getClass().getSimpleName()+"产品标准---"; } @Override public String toString() { return ProStandard()+this.getClass().getSimpleName()+"生产了!"; } } /** * 空调产品B系列 */ class AirCondition_B extends AirConditionAbstract{ public AirCondition_B(){ System.out.println(this.toString()); } @Override public String ProStandard() { return "==符合"+this.getClass().getSimpleName()+"产品标准---"; } @Override public String toString() { return ProStandard()+this.getClass().getSimpleName()+"生产了!"; } } /** * 洗衣机工厂 * @author Administrator * */ abstract class WasherFactoryAbstract implements Factory{} /** * 生产洗衣机产品A系列的车间 */ class WasherFactory_A_Depart extends WasherFactoryAbstract{ @Override public String facStandard() { return "***符合"+this.getClass().getSimpleName()+"工厂标准---"; } // @Override public Product createProduct() { System.out.println(facStandard()); return new Washer_A(); } } /** * 生产洗衣机产品B系列的车间 */ class WasherFactory_B_Depart extends WasherFactoryAbstract{ @Override public String facStandard() { return "***符合"+this.getClass().getSimpleName()+"工厂标准---"; } // @Override public Product createProduct() { System.out.println(facStandard()); return new Washer_B(); } } /** * 冰箱工厂 */ abstract class IceBoxFactoryAbstract implements Factory{} /** * 生产冰箱产品A系列的车间 */ class IceBoxFactory_A_Depart extends IceBoxFactoryAbstract{ @Override public String facStandard() { return "***符合"+this.getClass().getSimpleName()+"工厂标准---"; } // @Override public Product createProduct() { System.out.println(facStandard()); return new IceBox_A(); } } /** * 生产冰箱产品B系列的车间 */ class IceBoxFactory_B_Depart extends IceBoxFactoryAbstract{ @Override public String facStandard() { return "***符合"+this.getClass().getSimpleName()+"工厂标准---"; } // @Override public Product createProduct() { System.out.println(facStandard()); return new IceBox_B(); } } /** * 空调工厂 */ abstract class AirConditionFactoryAbstract implements Factory{} /** * 生产空调产品A系列的车间 */ class AirConditionFactory_A_Depart extends AirConditionFactoryAbstract{ @Override public String facStandard() { return "***符合"+this.getClass().getSimpleName()+"工厂标准---"; } // @Override public Product createProduct() { System.out.println(facStandard()); return new AirCondition_A(); } } /** * 生产空调产品B系列的车间 */ class AirConditionFactory_B_Depart extends AirConditionFactoryAbstract{ @Override public String facStandard() { return "***符合"+this.getClass().getSimpleName()+"工厂标准---"; } // @Override public Product createProduct() { System.out.println(facStandard()); return new AirCondition_B(); } }
上述代码执行后,控制台打印如下:
***符合WasherFactory_A_Depart工厂标准--- ==符合Washer_A产品标准---Washer_A生产了! ***符合WasherFactory_B_Depart工厂标准--- ==符合Washer_B产品标准---Washer_B生产了! ***符合IceBoxFactory_A_Depart工厂标准--- ==符合IceBox_A产品标准---IceBox_A生产了! ***符合IceBoxFactory_B_Depart工厂标准--- ==符合IceBox_B产品标准---IceBox_B生产了! ***符合AirConditionFactory_A_Depart工厂标准--- ==符合AirCondition_A产品标准---AirCondition_A生产了! ***符合AirConditionFactory_B_Depart工厂标准--- ==符合AirCondition_B产品标准---AirCondition_B生产了!