工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过工厂父类定义负责创建产品的公共接口,子类负责生产具体对象。可以理解为简单工程模式的升级,解决简单工厂模式的弊端。
~
本篇内容包括:关于 工厂方法模式、工厂方法模式 Demo。
抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。这里的抽象角色就是产品族。
Ps:产品族是具有相同属性的同类型产品。
抽象工厂,非常适合解决两个维度的组合产品的构造问题,取其中一个维度作为产品族,另外一个维度作为产品族中具体的多个产品。
抽象工厂的构成:
抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。。
具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式支持多个抽象产品。
具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一关系。
首先,根据具体产品进行抽象,将它们的公共的代码进行抽象和提取后,封装在一个抽象产品中;
其次,根据抽象产品,将各种不同对象的相关代码封装到不同的类中,这些类称为具体产品类,每一个具体产品都是抽象产品的子类;
然后,提供一个抽象工厂类用于提供创建各种产品族产品的方法,在根据具体产品,实现相应的具体工厂类,实现创建对应产品的方法;
最后,客户端只需要调用具体工厂类的工厂方法可得到一个相应的具体产品对象。
优点:
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 工厂和抽象产品里加代码,又要在具体的里面加代码。
我们设计一个图形工厂,其中图形有多种颜色(红色、蓝色 …),还有多种形状(矩形、圆形 …),我们利用工厂实现红色矩形 和 蓝色圆形的生产。
# 角色
Shape(抽象形状类)、Retangle(矩形类)、Circle(圆形类)
Color(抽象颜色类)、Red(红色类)、Blue(蓝色类)
ShapeFactory(抽象工厂类)、RedRetangleFactory(红色矩形工厂)、BlueCircleFactory(蓝色圆形工厂)
# 实现
Shape 作为形状产品族的抽象父类、Color 作为颜色产品族的抽象父类,使用 ShapeFactory 抽象工厂类分别实现颜色和形状的设计,最后由具体工厂实现类返回具体的颜色和形状实现
# Shape 形状类
//抽象形状类
public abstract class Shape {public abstract void sayShape();
}//矩形类
public class Retangle extends Shape {@Overidepublic void sayShape() {System.out.println("Hi, I'm Retangle!");}
}//圆形类
public class Circle extends Shape {@Overidepublic void sayShape() {System.out.println("Hi, I'm Circle!");}
}
# Color 颜色类
//抽象颜色类
public abstract class Color {public abstract void sayColor();
}//红色类
public class Red extends Color {@Overidepublic void sayColor() {System.out.println("Hi, I'm Red!");}
}//白色类
public class Blue extends Color {@Overidepublic void sayColor() {System.out.println("Hi, I'm Blue!");}
}
# ShapeFactory 工厂类
//抽象工厂类
public abstract class ShapeFactory {public abstract Shape createShape();public abstract Color createColor();
}//红色的矩
public class RedRetangleFactory extends ShapeFactory {@Overidepublic Shape createShape() {return new Retangle();}@Overidepublic Color createColor() {return new Red();}
}//蓝色的圆
public class BuleCircleFactory extends ShapeFactory {@Overidepublic Shape createShape() {return new Circle();}@Overidepublic Color createColor() {return new blue();}
}
public class Client {public static void main(String[] args) {Color color;Shape shape;// 红色矩形ShapeFactory factory = new RedRetangleFactory();color = factory.createColor();shape = factory.createShape();}
}