抽象工厂模式

概述

前面我们已经说到了工厂模式,现在我们扯扯抽象工厂模式。从字母意思理解下,工厂也就是会生产指定的产品。那么抽象工厂就意味着生产出来的产品不是指定的。往简单点说,抽象工厂就是为创建一组相关或者相互依赖的对象提供一个接口,而不需要指明他们的具体类。

使用场景

一个产品族有相同的约束时可以使用抽象工厂模式。是不是听起来很抽象?比如android、ios下都有短信软件和拨号软件,两者同属于软件。但是,他们所在的系统不一样,即使是同一家公司出品的软件,代码实现也是不一样的。这个时候就可以考虑使用抽象工厂模式来产生这些软件。

具体实现

首先,我们创建一个实体类的接口:

public interface Shape {
void draw();
}

现在我们创建2个实体类去实现这个接口:

public class Square implements Shape {
@Override
public void draw() {
System.out.println("Square:draw() method.");
}
}
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Circle:draw() method.");
}
}

我们在创建一个实体类的接口:

public interface Color{
void fill();
}

我们继续创建2个实体类去实现这个接口:

public class RedColor implements Color{
@Override
public void fill(){
System.out.println("Color:Red");
}
}
public class BlueColor implements Color{
@Override
public void fill(){
System.out.println("Color:Blue");
}
}

现在我们创建一个工厂类:

public abstract class Factory{
public abstract Shape createShape();
public abstract Color createColor();
}

接着我们创建2个工厂去实现这个工厂类:

public class RedSquareFactory extends Factory{
@Override
public Shape createShape(){
return new Square();
}
@Override
public Color createColor(){
return new RedColor();
}
}
public class BlueCircleFactory extends Factory{
@Override
public Shape createShape(){
return new Circle();
}
@Override
public Color createColor(){
return new BlueColor();
}
}

最后我们来写个demo:

public class Demo{
public static void main(String[] args){
Factory redSquareFactory=new RedSquareFactory();
redSquareFactory.createShape().draw();
redSquareFactory.createColor().fill();
Factory blueCircleFactory=new BlueCircleFactory();
blueCircleFactory.createShape().draw();
blueCircleFactory.createColor().fill();
}
}

输出结果如下:

Square:draw() method.
Color:Red
Circle:draw() method.
Color:Blue

总结

优点:

  • 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点:

  • 产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
坚持原创技术分享,您的支持将鼓励我继续创作!
0%