java设计模式-抽象工厂设计模式
简单说一下
前面我们说过工厂方法模式以及简单工厂模式,那么接下来我们聊下抽象工厂设计模式:抽象工厂设计模式是一种为访问类提供一个创建一组相关或者相互依赖对象的接口,且访问类无需指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。话句话说在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显示指定它们的类。
如果以上定义你还是不理解的话,那我们还是举个栗子:比如某个程序员突然要回家开垦自己的一亩三分地,在这快一亩三分地,他想养马、养牛、养羊,种花,种草,种黄瓜等,这无疑在类的实例化方面操作比较复杂,所以必须用抽象工厂模式来设计两块地,一块地养牲畜,一块地种植物,即可以在以上两块地定义牲畜new Animal()和植物new Plant()方法。
用精致的话一句话说:抽象工厂设计模式就是抽出来像的部分,简化多类复杂的操作。
顺便提一下
我们前边所说到的工厂方法模式考虑的只是一类产品的生产,如畜牧场只养动物,自行车厂只生产自行车,手机制造厂只生产手机。也就是说工厂方法模式只考虑生产同等级的产品。
但是抽象工厂设计模式是考虑等级产品的生产,将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族,比如农场里既养动物又种植物,大学既有软件专业又有视频专业等。
一图走天下(网上当的):
简单夸一下
抽象工厂模式是工厂方法模式的升级版,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
优点如下:
1.可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
2.当增加一个新的产品族时不需要修改原代码,满足开闭原则。
狠狠吐一下
缺点:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。
多多用一下
先配一张网上当的结构图:
代码实现(还是用之前提到的Shape类举例)
1.创建形状一个接口Shape.java
public interface Shape {
void draw();
}
2.创建实现形状接口的实体类Circle.java\Square.java\Rectangle.java
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("这是一个圆形");
}
}
-------------------------------------------
public class Square implements Shape {
@Override
public void draw() {
System.out.println("这是一个正方形");
}
}
-------------------------------------------
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("这是一个长方形");
}
}
3.创建一个颜色接口Color.java
public interface Color {
void fill();
}
4.创建实现颜色接口的实体类Red.java\Green.java\Blue.java
public class Red implements Color {
@Override
public void fill() {
System.out.println("这是红色");
}
}
----------------------------------------------
public class Green implements Color {
@Override
public void fill() {
System.out.println("这是绿色");
}
}
----------------------------------------------
public class Blue implements Color {
@Override
public void fill() {
System.out.println("这是蓝色");
}
}
5.为Shape和Color对象创建抽象类来获取工厂AbstractFactory.java
public abstract class AbstractFactory {
public abstract Color getColor(String color);
public abstract Shape getShape(String shape);
}
6.创建扩展了 AbstractFactory 的工厂类,基于给定的信息生成实体类的对象ShapeFactory.java\ColorFactory.java
public class ShapeFactory extends AbstractFactory{
@Override
public Color getColor(String color) {
return null;
}
public Shape getShape(String shapeType){
if(shapeType == null){
return null;
}
if(shapeType.equalsIgnoreCase("circle")){
return new Circle();
}else if(shapeType.equalsIgnoreCase("square")){
return new Square();
}else if(shapeType.equalsIgnoreCase("rectangle")){
return new Rectangle();
}
return null;
/*equalsIgnoreCase:和equals的区别是不需要考虑字符大小写*/
}
}
---------------------------------------------------------
public class ColorFactory extends AbstractFactory {
@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;
}
@Override
public Shape getShape(String shape) {
return null;
}
}
7.创建一个工厂创造器/生成器类,通过传递形状或颜色信息来获取工厂FactoryProducer .java
public class FactoryProducer {
public static AbstractFactory getFactory(String choice){
if(choice.equalsIgnoreCase("shape")){
return new ShapeFactory();
}else if(choice.equalsIgnoreCase("color")){
return new ColorFactory();
}
return null;
}
}
8.使用 FactoryProducer 来获取 AbstractFactory,通过传递类型信息来获取实体类的对象AbstractFactoryPattern.java
public class AbstractFactoryPattern {
public static void main(String[] args) {
/*获取形状工厂*/
AbstractFactory shapeFactory = FactoryProducer.getFactory("shape");
/*获取形状为Circle的对象*/
Shape shape1 = shapeFactory.getShape("circle");
/*调用Circle的draw方法*/
shape1.draw();
/*获取颜色工厂*/
AbstractFactory colorFactory = FactoryProducer.getFactory("color");
/*获取颜色为Red的对象*/
Color color1 = colorFactory.getColor("red");
/*调用Red的fill方法*/
color1.fill();
}
}
9.运行结果
这是一个圆形
这是红色