一.为什么要使用工厂设计模式
1.使用工厂设计模式主要目的是为了解耦,即对象的创建和对象的使用分开来进行,如classA需要使用classB的对象,自己不需要new一个classB的对象,交给工厂即可,符合“单一职责原则”,有利于对功能的复用和系统的维护。
2.防止用来创建和实例化一个类的数据和代码在许多类中都存在,可以将创建该类的代码封装到一个工厂类中去,减少代码冗余,有益于系统优化和维护。
3.工厂管理了类的创建逻辑,使用者不需要知道类的创建逻辑如何,只需要使用即可,减少出错的概率。
二.厂模式的三种类型
1.简单工厂类
package com.yqg.day2; public class Factory { int num; public Factory(int num) { this.num=num; } public Product getProduct() { switch(num) { case 1: return new Product1(); case 2: return new Product2(); default: return null; } } } interface Product{ void said(); } class Product1 implements Product{ @Override public void said() { System.out.println("产品1"); } } class Product2 implements Product{ @Override public void said() { System.out.println("产品2"); } }
缺点:如果产品类非常多,会给产品维护和扩展带来很多麻烦。而且有新的产品加入就要修改工厂类的代码,违反了开闭原则,扩展开始,修改关闭。
2.工厂模式
interface IFactory //工厂接口 { IProduct GetProduct(); } //A工厂类 public class FactoryA: IFactory { IProduct productA; public FactoryA() { this.productA = new ProductA(); } public IProduct GetProduct() //A工厂生产A产品 { return this.productA; } } //B工厂类 public class FactoryB : IFactory { IProduct productB; public FactoryB() { this.productB = new ProductB(); } public IProduct GetProduct() //B工厂生产B产品 { return this.productB; } } //产品接口 public interface IProduct { //产品方法 //...... } //产品A public class ProductA : IProduct { //产品属性 //...... } //产品B public class ProductB : IProduct { //产品属性 //...... }
观察代码,现在一个工厂负责生产一个产品,如果新增产品C,只需要增加一个工厂C生产产品C,不会对其他产品造成影响,但是工厂模式无法满足产品族和产品等级结构的问题。所以我们用到了下面的抽象工厂。
3.抽象工厂
//工厂接口,即抽象工厂 interface IFactory { IFridge CreateFridge(); IAirCondition CreateAirCondition(); } //三星的工厂,生产三星的产品族 public class SamsungFactory : IFactory { public IAirCondition CreateAirCondition() { return new SamsungAirCondition(); //三星的工厂生产三星的空调 } public IFridge CreateFridge() { return new SamsungFridge(); //三星的工厂生产三星的冰箱 } } //格力的工厂,生产格力的产品族 public class GreeFactry : IFactory { public IAirCondition CreateAirCondition() { return new GreeAirCondition(); //格力的工厂生产格力的空调 } public IFridge CreateFridge() { return new GreeFridge(); //格力的工厂生产格力的冰箱 } } //冰箱产品接口 public interface IFridge { //冰箱产品接口 //冰箱的action } //空调接口 public interface IAirCondition { //空调产品接口 //空调的action } //三星的冰箱 public class SamsungFridge: IFridge { //三星冰箱的action和property } //格力的冰箱 public class GreeFridge : IFridge { //格力冰箱的action和property } //三星的空调 public class SamsungAirCondition : IAirCondition { //三星空调的action和property } //格力的空调 public class GreeAirCondition : IAirCondition { //格力空调的action和property }
4.总结
一、三种工厂的实现是越来越复杂的
二、简单工厂通过构造时传入的标识来生产产品,不同产品都在同一个工厂中生产,这种判断会随着产品的增加而增加,给扩展和维护带来麻烦
三、工厂模式无法解决产品族和产品等级结构的问题
四、抽象工厂模式中,一个工厂生产多个产品,它们是一个产品族,不同的产品族的产品派生于不同的抽象产品(或产品接口)。