您的位置:首页 > 编程语言 > Java开发

设计模式之工厂模式,抽象工厂模式

2017-04-25 00:00 411 查看
首先,我先谈下我对设计模式的理解。设计模式是很不错的但是容易被滥用,各位在学习的初期就记住一点。大胆的使用设计模式这样才能够学会。在使用的过程中遇到了坑才能明白什么时候该使用设计模式什么时候不该使用设计模式。在学习的过程中记得画UML建模图,这是我学习设计模式的一个技巧。

工厂模式主要是用来给我创建对象的,在不复杂的系统中不建议使用。



在上图中,我们需要关注的就是ShapeFactroy类。它生成了Shape接口的引用。下面我们来看代码。

/**
* Created by gao.mq on 2017/4/25.
* 图形的接口
*/
public interface Shape {
public void draw();
}

/**
* Created by gao.mq on 2017/4/25.
* 绘画圆形
*/
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("draw Circle");
}
}

/**
* Created by gao.mq on 2017/4/25.
* 正方形的绘画
*/
public class Square implements Shape {
@Override
public void draw() {
System.out.println("draw square");
}
}

/**
* Created by gao.mq on 2017/4/25.
* 绘画矩形
*/
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("draw Rectangle");
}
}

上面四个类就是模拟UML左边的情况,下面来让我们看右边的模拟。

/**
* Created by gao.mq on 2017/4/25.
* 创建工厂
*/
public class ShapeFactory  {

private static final Map<String, Shape> map = new HashMap<>();

static {
map.put("circle", new Circle());
map.put("rectangle", new Rectangle());
map.put("square", new Square());
}

public Shape getShape(String shapeType) {
return map.get(shapeType);
}

大家注意一下上述图中Map的使用技巧,这样我们就不需要判断当前需要实例化哪个对象了。

下面就是我们的测试类:

/**
* Created by gao.mq on 2017/4/25.
* 工厂模式测试
*/
public class FactoryPattern {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
Shape shape = shapeFactory.getShape("circle");
shape.draw();
}
}

输出结果:draw Circle

总结一下:工厂模式的主要功能是为了创建对象。在我们需要扩展的时候只需写个实现Shape接口即可。使用的map中可以改成用枚举等类型,这里就不带大家做尝试了。

下面我们来看看抽象工厂模式,抽象工厂模式所创建的对象是为了一系对象,我们直接来看下UML图



这里我简要的说一下,Shape,Color为接口。AbstractFactory为抽象类。ShapeFactory,ColorFactory继承了该接口。

/**
* Created by gao.mq on 2017/4/25.
*/
public class ColorFactory extends AbstractFactory{

private static final Map<String,Color> map=new HashMap<>();
static {
map.put("red",new Red());
map.put("green",new Green());
map.put("blue",new Blue());
}

@Override
public   Shape getShape(String shapeType) {
return null;
}

@Override
public Color getColor(String colorType) {
return map.get(colorType);
}
}

/**
* Created by gao.mq on 2017/4/25.
* 创建工厂
*/
public class ShapeFactory extends AbstractFactory {

private static final Map<String, Shape> map = new HashMap<>();

static {
map.put("circle", new Circle());
map.put("rectangle", new Rectangle());
map.put("square", new Square());
}
@Override
public Shape getShape(String shapeType) {
return map.get(shapeType);
}

@Override
public Color getColor(String colorType) {
return null;
}
}

/**
* Created by gao.mq on 2017/4/25.
* 抽象工厂
*/
public abstract class AbstractFactory {
public abstract Shape getShape(String shapeType);
public abstract Color getColor(String colorType);
}

当我们需要多少组对象在继承abstractFactory时就实现多少,没有的就return null

下面我们来看测试类:

/**
* Created by gao.mq on 2017/4/25.
* 抽象工厂测试类
*/
public class AbstractFactoryTest {
public static void main(String[] args) {
AbstractFactory abstractFactory = FactoryProduct.getFactory("color");
Color color = abstractFactory.getColor("blue");
color.fill();
}
}

这样我们就可以输出 fill blue 了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java