设计模式 —— 工厂模式
@(Android)
简单工厂模式(Simple Factory)
模式定义
简单工厂模式(Simple Factory Pattern):定义一个工厂类来负责创建某些类的实例,这些类具有共同的父类,工厂根据传入的参数返回不同类的实例。
模式结构
简单工厂模式包含如下角色:
Factory:工厂角色
工厂角色负责实现创建所有实例的内部逻辑
Product:抽象产品角色
抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口
ConcreteProduct:具体产品角色
具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。
使用说明
优点:
实现对象的创建和使用的分离,将对象的创建交给专门的工厂类负责
缺点:
工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码将会非常复杂。
使用场景:
工厂类负责创建的对象比较少;客户端只知道传入工厂类的参数,对于如何创建对象不关心。
Example
Shape
public interface Shape {
void draw();
}
Circle
public class Circle implements Shape {
@Override
public void draw() {
...
}
}
Square
public class Square implements Shape{
@Override
public void draw() {
...
}
}
Rectangle
public class Rectangle implements Shape {
@Override
public void draw() {
...
}
}
ShapeFactory
public class ShapeFactory {
public static Shape createShape(String type){
if(type == null){
return null;
}
switch(type){
case "CIRCLE":
return new Circle();
case "SQUARE":
return new Square();
case "RECTANGLE":
return new Rectangle();
}
return null;
}
}
使用
//创建Circle的实例
Shape circle = ShapeFactory.createShape("CIRCLE");
circle.draw();
工厂方法模式(Factory Method)
模式定义
工厂方法模式(Factory Method Pattern):在工厂方法模式中,抽象工厂负责定义创建产品对象的公共接口,而具体工厂则负责生成具体的产品对象。
模式结构
工厂方法模式包含如下角色:
Factory:抽象工厂
抽象工厂中声明了工厂方法,用于返回一个产品,它是工厂方法模式的核心,任何在模式中创建对象的工厂类都必须实现该接口。
Product:抽象产品
抽象产品是定义产品的接口,是工厂方法模式所创建对象的超类,即产品对象的共同父类或接口。
ConcreteFactory:具体工厂
具体工厂是抽象工厂的子类,实现了抽象工厂中定义的工厂方法,并可由客户调用,返回一个具体产品类的实例。
ConcreteProduct:具体产品
具体产品实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,它们之间往往一一对应
使用说明
工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。
在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。
优点:
增加加新的产品类时无须修改现有系统,并封装了产品对象的创建细节,系统具有良好的灵活性和可扩展性。
缺点:
增加新产品的同时需要增加新的工厂,导致系统类的个数成对增加,在一定程度上增加了系统的复杂性。
Example
Shape
public interface Shape {
void draw();
}
ShapeFactory
public interface ShapeFactory {
Shape createShape();
}
Circle
public class Circle implements Shape {
@Override
public void draw() {
}
}
CircleFactory
public class CircleFactory implements ShapeFactory{
public Shape createShape() {
return new Circle();
}
}
使用
//创建Circle的实例
ShapeFactory factory = new CircleFactory();
Shape circle = factory.createShape();
circle.draw();
抽象工厂模式(Abstract Factory)
相关概念
为了更清晰地理解工厂方法模式,需要先引入两个概念:
产品等级结构 :是指产品的继承结构
比如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
产品族 :是指由同一个工厂生产的,位于不同产品等级结构中的一组产品
比如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。
模式定义
抽象工厂模式(Abstract Factory Pattern):当工厂所需生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构中属于不同类型的具体产品时需要使用抽象工厂模式。
抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态。
模式结构
抽象工厂模式包含如下角色:
AbstractFactory:抽象工厂
ConcreteFactory:具体工厂
AbstractProduct:抽象产品
Product:具体产品
使用说明
抽象工厂模式与工厂方法模式的区别:
+ 工厂方法模式针对的是一个产品等级结构(同一类型产品),一个具体工厂对应一种具体产品
+ 抽象工厂模式则需要面对多个产品等级结构(多种类型产品),一个工厂可以负责多个不同产品等级结构中的产品对象的创建 。
当一个工厂可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方法模式更为简单、有效率。
Example
Fridge
public class Fridge {
}
AirConditioner
public class AirConditioner {
}
ApplianceFactory
public interface ApplianceFactory {
Fridge createFridge(String type);
AirConditioner createAirConditioner(String type);
}
HaierFactory
public class HaierFactory implements ApplianceFactory{
@Override
public Fridge createFridge(String type) {
if("FRIDGE".equals(type)){
return new Fridge();
}
return null;
}
@Override
public AirConditioner createAirConditioner(String type) {
if("AIRCONDITIONER".equals(type)){
return new AirConditioner();
}
return null;
}
}
MideaFactory
public class MideaFactory implements ApplianceFactory{
@Override
public Fridge createFridge(String type) {
if("FRIDGE".equals(type)){
return new Fridge();
}
return null;
}
@Override
public AirConditioner createAirConditioner(String type) {
if("AIRCONDITIONER".equals(type)){
return new AirConditioner();
}
return null;
}
}
使用:
ApplianceFactory factory = new HaierFactory();
Fridge fridge = factory.createFridge("FRIDGE");