简单来说工厂模式就是帮助我们创建对象,隐藏了对象创建过程的复杂度(如类B需要调用类A,工厂类提供A类的创建接口,B只需要调用接口传入相应参数即可)、避免你辛苦的准备构造方法的参数。说白了--就是工厂提供产品给客户(按照提供的方式不同分成三类:简单工厂、工厂、抽象工厂) 具体简介看下面:
工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,可以考虑是否使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量
工厂模式有以下几个角色(结合下面流程图理解),产品即需要创建的实例对象
抽象工厂模式:
含义:没有抽象工厂类,由工厂类自身提供产品,代码如下
抽象产品类(抽象类或接口)
public interface IProduct{ void method(); } 复制代码
具体产品实现类
//A产品 public class ProductA implement IProduct{ void method(){ logger.info("ProductA"); } } //B产品 public class ProductB implement IProduct{ void method(){ logger.info("ProductB"); } } 复制代码
工厂类
public class Factory{ //简单工厂模式 只有一个静态方法提供产品所以也叫静态工厂方法 public static IProduct createProduct(String productName){ if("A".equals("A"){ return new ProductA(); }else if("B".equals("B"){ return new ProductB(); }else } } 复制代码
工厂模式有一个抽象工厂类对应多个具体工厂实现类、一个抽象产品类对应一个具体实现类、并且每个具体工厂类只能创建一个具体产品类的实例
抽象产品类(抽象类或接口)
public interface IProduct{ void method(); } 复制代码
具体产品实现类
//A产品 public class ProductA implement IProduct{ void method(){ logger.info("ProductA"); } } //B产品 public class ProductB implement IProduct{ void method(){ logger.info("ProductB"); } } 复制代码
抽象工厂类(抽象类或接口)
public abstract class Factory{ /** *抽象工厂方法 *具体产生什么由子类决定 *@return 具体产品对象 */ public abstract IProduct createProduct(); } 复制代码
具体工厂类
//A工厂 public class AFactory extends Factory { //提供A产品 public IProduct createProduct(){ return new ProductA(); } } //B工厂 public class BFactory extends Factory { //提供B产品 public IProduct createProduct(){ return new ProductB(); } } 复制代码
用法
Factory factory = new AFactory(); IProduct aProduct = factory.createProduct(); product.method(); 复制代码
工厂模式有一个抽象工厂类对应多个具体工厂实现类、多个抽象产品类对应多个具体实现类、 并且每个具体工厂类可以创建多个具体产品类的实例。
抽象产品类(抽象类或接口)
//饮料 public interface IDrink{ void method(); } //食物 public interface IFood{ void method(); } 复制代码
具体产品实现类
//面条 public class Noddle implement IFood{ void method(){ logger.info("面条"); } } //米饭 public class Rice implement IFood{ void method(){ logger.info("米饭"); } } //可乐 public class Cola implement IDrink{ void method(){ logger.info("可乐"); } } //米饭 public class Sprite implement IDrink{ void method(){ logger.info("雪碧"); } } 复制代码
抽象工厂类(抽象类或接口)
public abstract class Factory{ /** *抽象工厂方法 *具体产生什么由子类决定 *@return 具体产品对象 */ public abstract IFood createFoodProduct(); public abstract IDrink createDrinkProduct(); } 复制代码
具体工厂类
//A餐工厂(提供可乐和米饭) public class AFactory extends Factory{ //提供可乐 public IDrink createDrinkProduct(){ return new Cola(); } //提供米饭 public IFood createFoodProduct(){ return new Rice(); } } //B餐工厂(提供面条和雪碧) public class BFactory extends Factory{ //提供面条 public IFood createFoodProduct(){ return new Noddle(); } //提供雪碧 public IDrink createDrinkProduct(){ return new Sprite(); } } 复制代码
用法
Factory factory = new AFactory(); IDrink cola = factory.createDrinkProduct(); cola.method(); IFood riceFood = factory.createFoodProduct(); riceFood.method(); 复制代码
有利有弊
优点:将对象的创建统一起来便于维护和整体把控,对扩展开放,对修改封闭
缺点:耦合性提高,由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中,这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利。
使用有限制
从工厂模式的示例可以看出:工厂模式需要类实现它的接口并且在业务内部存在明显的继承关系,比如汽车和奔驰宝马的关系。而继承关系往往存在于模型之间,业务之间很难存在继承关系,因此如果业务内部或者业务之间没有这种显式的继承关系该咋办?就算业务内部有继承关系,各个业务交给你统一管理,这样就会提高代码的耦合性,当创建逻辑复杂的时候,工厂方法就很复杂,容易产生干扰。
其开闭性优点很容易被替代
可以通过高度层次化和模块化来提高系统的开闭性,而不必生硬地去套用工厂模式。
文章每周持续更新,可以微信搜索「 十分钟学编程 」第一时间阅读和催更,如果这个文章写得还不错,觉得有点东西的话 ~求点赞:+1: 求关注:heart: 求分享:heart:
各位的支持和认可,就是我创作的最大动力,我们下篇文章见!