作为一名面向对象的Java工程师,设计模式肯定是必会的,之前虽然也看了一些设计模式的资料,也学习过,但是没有动手写下学习的心得,有的时候想再去看看的时候记不清在哪里,干脆就写道这个博客里,以后忘记了也好有复习的地方。

菜鸟教程设计模式地址:http://www.runoob.com/design-pattern/design-pattern-intro.html

有兴趣的可以去菜鸟教程的设计模式教程里看一下,我个人觉得写的挺好的,下面就写一下我个人看了之后的学习心得。

说一下抽象工厂的特点:

  • 对工厂类进行了抽象,工厂的提供类通过返回抽象工厂就可以返回各种不同的工厂。这样做的好处是使用一个工厂提供类就可以创建各种不同的工厂,进而来创建对象。例如,之前写的工厂设计模式中Shape的实现类有三个,三个实现类对象,每个对象只有一种对应的方法,如果现在加入一个颜色属性的话就需要再加一个颜色的接口,就需要再写一个颜色的工厂,如果对象的属性和行为比较多的话就需要写很多的工厂类和接口,那样的话每一种属性和方法都要new一个工厂类,现在只需要通过一个抽象工厂类就可以创建各种不同的工厂类,是不是更方便了一点。
  • 其他方面跟工厂类差不多,有接口,接口的实现类,工厂类,工程的提供类。

主要由以下几部分组成

  1. 接口
  2. 接口的实现类
  3. 抽象工厂类
  4. 工厂类
  5. 工厂提供类

实际的结构图是下图这样

设计模式——抽象工厂模式-LMLPHP

接口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();
	}

}

下面是打印结果

设计模式——抽象工厂模式-LMLPHP

 

10-04 10:12