前面我们已经说到了工厂模式,现在我们扯扯抽象工厂模式。从字母意思理解下,工厂也就是会生产指定的产品。那么抽象工厂就意味着生产出来的产品不是指定的。往简单点说,抽象工厂就是为创建一组相关或者相互依赖的对象提供一个接口,而不需要指明他们的具体类。
一个产品族有相同的约束时可以使用抽象工厂模式。是不是听起来很抽象?比如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
优点:
缺点: