什么是抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
我个人理解就是抽象工厂就是工厂模式的一个升级版,工厂模式是一个工厂里生产对象,而抽象工厂模式就是生产工厂的工厂,相当于一个超级工厂,超级工厂包含好多工厂。举个例子就是:比如nike、特步,他们都属于生产球鞋的厂商,但是nike是nike厂商,特步是特步厂商,意思就是nike厂商生产的属于nike,特步厂商生产的属于特步。宏观的讲就是一个大的产品组下又包含好多产品
如有偏差,请多指教!!
目的
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
主要解决
主要解决接口选择的问题。
使用时机
系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
如何解决
在一个产品族里面,定义多个产品。
优点
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点
产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
注意事项
产品族难扩展,产品等级易扩展。
Demo
- 创建接口(可以理解为总的类型的一个分类,也是封装、继承、多态的体现)
/**
* 为颜色创建一个接口
*/
public interface Color {
void fill();
}
/**
1. 为形状创建一个接口
*/
public interface Shape {
void draw();
}
- 实现接口
/**
* 创建实现形状接口的实体类
*/
public class Rectangle implements Shape
{
@Override
public void draw() {
System.out.println("Rectangle :-----draw()");
}
}
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Square:-----draw()");
}
}
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Circle:----draw()");
}
}
/**
* 创建实现颜色接口的实体类
*/
public class Red implements Color {
@Override
public void fill() {
System.out.println("Color:----fill()");
}
}
public class Green implements Color {
@Override
public void fill() {
System.out.println("Color:----fill()");
}
}
public class Blue implements Color {
@Override
public void fill() {
System.out.println("Color:----fill()");
}
}
- 为color和shape对象创建抽象类来获取工厂
/**
* 为color和shape对象创建抽象类来获取工厂
*/
public abstract class AbstractFactory {
//获取工厂
public abstract Shape getShape(String shape);
//获取工厂
public abstract Color getColor(String color);
}
- 创建了扩展了AbstractFactory的工厂类信息,基于给定的信息生成实体类的对象
/**
* 创建了扩展了AbstractFactory的工厂类信息,基于给定的信息生成实体类的对象
*/
public class ColorFactory extends AbstractFactory {
@Override
public Shape getShape(String shape) {
return null;
}
@Override
public Color getColor(String color) {
if(color == null){
return null;
}
if(color.equalsIgnoreCase("Red")){
return new Red();
}else if(color.equalsIgnoreCase("Green")){
return new Green();
}else if(color.equalsIgnoreCase("Blue")){
return new Blue();
}
return null;
}
}
/**
* 创建了扩展了AbstractFactory的工厂类信息,基于给定的信息生成实体类的对象
*/
public class ShapeFactory extends AbstractFactory {
@Override
public Shape getShape(String shape) {
if(shape == null){
return null;
}
if(shape.equalsIgnoreCase("Ractangle")){
return new Rectangle();
}else if(shape.equalsIgnoreCase("Square")){
return new Square();
}else if(shape.equalsIgnoreCase("Circle")){
return new Circle();
}
return null;
}
@Override
public Color getColor(String color) {
return null;
}
}
- 工厂生产者类
/**
1. 工厂生产者
*/
public class FactoryProducer {
/**
* 通过类型获得对应的工厂
* @param choice 选择类型
* @return 返回对应的工厂
*/
public static AbstractFactory getFactory(String choice){
if(choice.equalsIgnoreCase("Shape")){
return new ShapeFactory();
}else if(choice.equalsIgnoreCase("Color")){
return new ColorFactory();
}
return null;
}
}
- 测试结果
/**
1. 抽象工厂模式Demo
*/
public class AbstractFactoryDemo {
public static void main(String[] args) {
//通过传入类型获取对应的工厂
AbstractFactory shapeFactory = FactoryProducer.getFactory("shape");
//传入所需对象类型获取对象
Shape ractangle = shapeFactory.getShape("Ractangle");
//调用Ractangle的draw();
ractangle.draw();
//获取形状为Circle的对象
Shape circle = shapeFactory.getShape("Circle");
//调勇Circle的draw()
circle.draw();
//获取形状为Square的对象
Shape square = shapeFactory.getShape("Square");
//调勇Square的draw()
square.draw();
//获取颜色工厂
AbstractFactory colorFactory = FactoryProducer.getFactory("color");
//获取红颜色的对象
Color color = colorFactory.getColor("Red");
//调用红颜色的fill()
color.fill();
//获取绿颜色的对象
Color green = colorFactory.getColor("Green");
//调用绿颜色的fill()
green.fill();
//获取蓝颜色的对象
Color blue = colorFactory.getColor("Blue");
//调用蓝颜色的fill()
blue.fill();
}
}
- 结果输出
今天学到了2/23的抽象工厂模式,兄弟们,撸起来!!!