作为一名面向对象的Java工程师,设计模式肯定是必会的,之前虽然也看了一些设计模式的资料,也学习过,但是没有动手写下学习的心得,有的时候想再去看看的时候记不清在哪里,干脆就写道这个博客里,以后忘记了也好有复习的地方。
菜鸟教程设计模式地址:http://www.runoob.com/design-pattern/design-pattern-intro.html
有兴趣的可以去菜鸟教程的设计模式教程里看一下,我个人觉得写的挺好的,下面就写一下我个人看了之后的学习心得。
说一下抽象工厂的特点:
- 对工厂类进行了抽象,工厂的提供类通过返回抽象工厂就可以返回各种不同的工厂。这样做的好处是使用一个工厂提供类就可以创建各种不同的工厂,进而来创建对象。例如,之前写的工厂设计模式中Shape的实现类有三个,三个实现类对象,每个对象只有一种对应的方法,如果现在加入一个颜色属性的话就需要再加一个颜色的接口,就需要再写一个颜色的工厂,如果对象的属性和行为比较多的话就需要写很多的工厂类和接口,那样的话每一种属性和方法都要new一个工厂类,现在只需要通过一个抽象工厂类就可以创建各种不同的工厂类,是不是更方便了一点。
- 其他方面跟工厂类差不多,有接口,接口的实现类,工厂类,工程的提供类。
主要由以下几部分组成
- 接口
- 接口的实现类
- 抽象工厂类
- 工厂类
- 工厂提供类
实际的结构图是下图这样
接口1
package com.soft.abstractFactoryPattern.inter;
/**
* 定义一个填充颜色的方法
* @author chenlei
*
*/
public interface Color {
public void fill();
}
package com.soft.abstractFactoryPattern.inter;
/**
* 创建一个画出形状的方法
* @author chenlei
*
*/
public interface Shape {
public void draw();
}
接口的实现类就贴出来两个大家看一下。
package com.soft.abstractFactoryPattern.impl.color;
import com.soft.abstractFactoryPattern.inter.Color;
public class Blue implements Color {
@Override
public void fill() {
// TODO Auto-generated method stub
System.out.println("填充了蓝色");
}
}
package com.soft.abstractFactoryPattern.impl.shape;
import com.soft.abstractFactoryPattern.inter.Shape;
public class Cirle implements Shape {
@Override
public void draw() {
// TODO Auto-generated method stub
System.out.println("画了一个圆形");
}
}
抽象工厂类
package com.soft.abstractFactoryPattern.abstractFactory;
import com.soft.abstractFactoryPattern.inter.Color;
import com.soft.abstractFactoryPattern.inter.Shape;
public abstract class AbstractFactory {
public abstract Shape getShape(String shape);
public abstract Color getColor(String color);
}
颜色工厂类
package com.soft.abstractFactoryPattern.factory;
import com.soft.abstractFactoryPattern.abstractFactory.AbstractFactory;
import com.soft.abstractFactoryPattern.impl.color.Blue;
import com.soft.abstractFactoryPattern.impl.color.Green;
import com.soft.abstractFactoryPattern.impl.color.Red;
import com.soft.abstractFactoryPattern.inter.Color;
import com.soft.abstractFactoryPattern.inter.Shape;
/**
* 填充颜色的工厂
* @author chenlei
*
*/
public class ColorFactory extends AbstractFactory{
@Override
public Color getColor(String color){
Color cl;
switch (color) {
case "Red":
cl = new Red();
break;
case "Blue":
cl = new Blue();
break;
case "Green":
cl = new Green();
break;
default:
cl = new Red();
break;
}
return cl;
}
@Override
public Shape getShape(String shape) {
// TODO Auto-generated method stub
return null;
}
}
形状工厂类
package com.soft.abstractFactoryPattern.factory;
import com.soft.abstractFactoryPattern.abstractFactory.AbstractFactory;
import com.soft.abstractFactoryPattern.impl.shape.Cirle;
import com.soft.abstractFactoryPattern.impl.shape.Rectangle;
import com.soft.abstractFactoryPattern.impl.shape.Triangle;
import com.soft.abstractFactoryPattern.inter.Color;
import com.soft.abstractFactoryPattern.inter.Shape;
/**
* 創建返回形狀對象的工廠
* @author chenlei
*
*/
public class ShapeFactory extends AbstractFactory{
@Override
public Shape getShape(String shape){
Shape sp;
switch (shape) {
case "Cirle":
sp = new Cirle();
break;
case "Rectangle":
sp = new Rectangle();
break;
case "Triangle":
sp = new Triangle();
break;
default:
sp = new Cirle();
break;
}
return sp;
}
@Override
public Color getColor(String color) {
// TODO Auto-generated method stub
return null;
}
}
工厂的提供类
package com.soft.abstractFactoryPattern.factoryProducer;
import com.soft.abstractFactoryPattern.abstractFactory.AbstractFactory;
import com.soft.abstractFactoryPattern.factory.ColorFactory;
import com.soft.abstractFactoryPattern.factory.ShapeFactory;
/**
* 创建工厂生成器
* @author chenlei
*
*/
public class FactoryProducer {
public AbstractFactory getFactory(String choice) {
if (choice.equalsIgnoreCase("Shape")) {
return new ShapeFactory();
} else if (choice.equalsIgnoreCase("Color")) {
return new ColorFactory();
}
return null;
}
}
下面是测试类,通过FactoryProducer类来创建工厂类,再通过工厂类来创建对应的形状或者颜色,抽象类和接口的作用就是作为子类和实现类的模板,对子类和实现类的行为和属性进行规范。
package com.soft.abstractFactoryPattern.test;
import com.soft.abstractFactoryPattern.abstractFactory.AbstractFactory;
import com.soft.abstractFactoryPattern.factoryProducer.FactoryProducer;
import com.soft.abstractFactoryPattern.inter.Color;
import com.soft.abstractFactoryPattern.inter.Shape;
public class Test {
public static void main(String[] args) {
//创建工厂
FactoryProducer fp = new FactoryProducer();
//获取颜色工厂
AbstractFactory colorFactory = fp.getFactory("Color");
//获取形状
AbstractFactory shapeFactory = fp.getFactory("Shape");
//
Color color = colorFactory.getColor("Red");
Shape shape = shapeFactory.getShape("Cirle");
shape.draw();
color.fill();
}
}
下面是打印结果