工厂模式
前言:
在我个人认为,在框架的后续学习中占据着挺重要的地位,这些模式让你能够更容易了解各类框架的设计理念,进一步提升你的编程水平,但最重要的是你能更容易的去记住框架的用法,所有东西都是,你想学的东西都是在你前面已经学过理解过一点才能继续学下去。
本次的代码基于Java编写
简单工厂模式
实现
- 抽象产品
public abstract class Product{ //Other public business methods public void businessMethods(){} //different methods of concrete products public abstract void concreteMethods(); }
- 具体产品
public class ConcreteProductA extends Product{ /** * 实现业务方法 */ @Override public void methodDiff() { System.out.println("Product A"); } }
public class ConcreteProductB extends Product { @Override public void methodDiff() { System.out.println("Product B"); } }
- 工厂角色
public class Factory { //Static factory method public static Product getProduct(String arg){ Product product = null; if(arg.equalsIgnoreCase("A")){ product = new ConcreteProductA(); //Initialize product }else if(arg.equalsIgnoreCase("B")){ product = new ConcreteProductB(); } return product; } }
总结
简单工厂模式是最简单的工厂模式,在开发中用得较少。
结构图
工厂模式
实现
- 抽象产品
public interface Product { //产品默认信息 public void info(); }
- 具体产品
//Product food public class Food implements Product{ @Override public void info() { System.out.println("I am the food!"); } }
//Product clothe public class Clothe implements Product { @Override public void info() { System.out.println("I am a clothe!"); } }
- 抽象工厂
//a interface public interface Factory{ Product produceProduct(String className); }
- 具体工厂
//concrete food factory public class FoodFactory implements Factory{ Product product; @Override public Product produceProduct(String className) { try { product = (Product) Class.forName(className).getDeclaredConstructor().newInstance(); }catch(Exception e){ e.printStackTrace(); } return product; } }
//concrete clothe factory public class ClotheFactory implements Factory { Product product; @Override public Product produceProduct(String className) { try{ product = (Product) Class.forName(className).getDeclaredConstructor().newInstance(); }catch (Exception e){ e.printStackTrace(); } return product; } }
总结
优点:
- 隐藏对象实例化细节,用户无需关心创建的细节,只需知道是什么工厂,用户不需再创建对象,由具体工厂来实现,控制权转移给了工厂;基于工厂模式的系统在添加新产品时,源码不需要进行修改,只需添加具体工厂,产品即可,保证了开闭原则。
缺点
- 虽确保了开闭原则,新增的具体类使得系统体积变得臃肿,增加开销。
工厂模式是简单工厂模式的扩展,继承了简单工厂模式的优点,同时弥补其不足,使用频率极高,在Spring全家桶尤其明显(AOC),是对面向编程中多态极致的体现。
结构图