Java 设计模式 简单工厂 工厂模式 抽象工厂
简单工厂模式
1、概念:简单工厂模式其实不是一个设计模式,反而比较像一种编程习惯。主要我们定义一个非常简单的类主要负责帮我们生产不同的产品。类图如下:
客户端通过简单工厂可以生产出具体产品A,具体产品B,具体产品C。
public class Factory
{
// 定义产品编号
public int prodNo;
// 构造工厂时告知工厂产品标识
public Factory(int prodNo)
{
this.prodNo = prodNo;
}
public IProduct GetProduct()
{
// 根据产品标识生产产品
switch (prodNo)
{
case prodNo1:
return new ProductA();
break;
case prodNo2:
return new ProductB();
break;
default:
...
}
}
}
// 产品A
class ProductA implements IProduct
{
//产品属性
//......
}
//产品B
class ProductB implements IProduct
{
//产品属性
//......
}
//产品接口
public interface IProduct
{
//产品方法
//......
}
简单工厂的问题就在于swich case(或者if else)。每当新增一种产品时,你都需要去维护工厂中的判断语句,造成该工厂类不断增长,各种判断挤在一起,给扩展和维护带来麻烦。产品和工厂没有实现完全解耦,绑定在一起
结论:简单工厂通过构造时传入的标识来生产产品,不同产品都在同一个工厂中生产,这种判断会随着产品的增加而增加,给扩展和维护带来麻烦
工厂方法模式
1、概念:这个和简单工厂有区别,简单工厂模式只有一个工厂,工厂方法模式对每一个产品都有相应的工厂。
构建一个工厂的时候,实际上是构建一个具体的子类对象,让子类决定去生产什么产品。
2、实例:
// 工厂接口
interface IFactory
{
IProduct GetProduct();
}
// A工厂类
class FactoryA implements IFactory
{
IProduct productA;
public FactoryA()
{
this.productA = new ProductA();
}
public IProduct GetProduct() //A工厂生产A产品
{
return this.productA;
}
}
//B工厂类
class FactoryB implements IFactory
{
IProduct productB;
public FactoryB()
{
this.productB = new ProductB();
}
public IProduct GetProduct() //B工厂生产B产品
{
return this.productB;
}
}
//产品接口
interface IProduct
{
//产品方法
//......
}
//产品A
class ProductA implements IProduct
{
//产品属性
//......
}
//产品B
class ProductB implements IProduct
{
//产品属性
//......
}
在工厂模式中,已经将工厂类分开,不再将所有产品在同一工厂中生产,解决了简单工厂中不断增加的switch case的问题。如再新增一个C产品,那么只需写一个C工厂和C产品,在调用时用C工厂生产C产品即可,A和B工厂和产品完全不受影响
结论:工厂模式无法解决产品族和产品等级结构的问题
抽象工厂模式:
1、概念:抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。为了方便引进抽象工厂模式,引进一个新概念:产品族(Product Family)。所谓产品族,是指位于不同产品等级结构,功能相关联的产品组成的家族。如图:
图中一共有四个产品族,分布于三个不同的产品等级结构中。只要指明一个产品所处的产品族以及它所属的等级结构,就可以唯一的确定这个产品。
引进抽象工厂模式
所谓的抽象工厂是指一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象。如果用图来描述的话,如下图:
2、抽象工厂模式的结构:
图中描述的东西用产品族描述如下:
- 抽象工厂(Abstract Factory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。
- 具体工厂(Concrete Factory)角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。
- 抽象产品(Abstract Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
- 具体产品(Concrete Product)角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。
2、实例:
// 工厂接口,即抽象工厂
interface IFactory
{
IFridge CreateFridge();
IAirCondition CreateAirCondition();
}
// 三星的工厂,生产三星的产品族
class SamsungFactory implements IFactory
{
public IAirCondition CreateAirCondition()
{
// 三星的工厂生产三星的空调
return new SamsungAirCondition();
}
public IFridge CreateFridge()
{
// 三星的工厂生产三星的冰箱
return new SamsungFridge();
}
}
// 格力的工厂,生产格力的产品族
class GreeFactry implements IFactory
{
public IAirCondition CreateAirCondition()
{
// 格力的工厂生产格力的空调
return new GreeAirCondition();
}
public IFridge CreateFridge()
{
// 格力的工厂生产格力的冰箱
return new GreeFridge();
}
}
// 冰箱产品接口
interface IFridge
{
// 冰箱产品接口
// 冰箱的action
}
// 空调接口
interface IAirCondition
{
// 空调产品接口
// 空调的action
}
// 三星的冰箱
public class SamsungFridge implements IFridge
{
// 三星冰箱的action和property
}
// 格力的冰箱
public class GreeFridge : IFridge
{
// 格力冰箱的action和property
}
// 三星的空调
public class SamsungAirCondition implements IAirCondition
{
// 三星空调的action和property
}
// 格力的空调
public class GreeAirCondition implements IAirCondition
{
/ /格力空调的action和property
}
在工厂模式中,一个工厂生产一个产品,所有的具体产品是由同一个抽象产品派生的,不存在产品等级结构和产品族的概念;而在抽象工厂中,同一个等级的产品是派生于一个抽象产品(即产品接口),一个抽象工厂派生不同的具体工厂,每个具体工厂生产自己的产品族(包含不同产品等级)
结论:工厂模式中,一个工厂生产一个产品,所有产品派生于同一个抽象产品(或产品接口);而抽象工厂模式中,一个工厂生产多个产品,它们是一个产品族,不同的产品族的产品派生于不同的抽象产品(或产品接口)
三种工厂模式关键点
-
三种工厂的实现是越来越复杂的
-
简单工厂通过构造时传入的标识来生产产品,不同产品都在同一个工厂中生产,这种判断会随着产品的增加而增加,给扩展和维护带来麻烦
-
工厂模式无法解决产品族和产品等级结构的问题
-
抽象工厂模式中,一个工厂生产多个产品,它们是一个产品族,不同的产品族的产品派生于不同的抽象产品(或产品接口)