面向对象-工厂模式

工厂模式有简单工厂模式,工厂方法模式,抽象工厂模式。
简单工厂模式:根据传入的参数决定出哪个对象,感觉上似乎Factory负责生产对象。简单工厂模式有抽象产品,具体产品和工厂三个角色,如完成一个用户画图的功能:
抽象产品:
package mode.factory.simple;

public abstract class Shape {
	public abstract void draw();
}
具体产品:
package mode.factory.simple;

public class Line extends Shape{

	@Override
	public void draw() {
		System.out.println("Line is drawed!");
	}
}
package mode.factory.simple;
public class Rectangle extends Shape {
	@Override
	public void draw() {
		System.out.println("Rectangle is drawed!");
	}
}
package mode.factory.simple;
public class Triangle extends Shape {
	@Override
	public void draw() {
		System.out.println("Triangle is drawed!");
	}
}
工厂:
package mode.factory.simple;

public class ShapeFactory {
	public Shape createShape(int shape){
		switch (shape) {
		case 1:
			return new Line();
		case 2:
			return new Triangle();
		case 3:
			return new Rectangle();
		default:
			return null;
		}
	}
}
使用:
package mode.factory.simple;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println("Input Shape No.:");
		BufferedReader br = new BufferedReader(new InputStreamReader((System.in)));
		int shapeNum = -1;
		try {
			shapeNum = Integer.parseInt(br.readLine());
		} catch (NumberFormatException e) {
			System.err.println("Can not recognize this shape");
		} catch (IOException e) {e.printStackTrace();}
		Shape shape = new ShapeFactory().createShape(shapeNum);
		shape.draw();
		
	}

}

这种存在的问题是工厂类和选择产出耦合性太高,改进:
1.增加一个抽象工厂类

package mode.factory.simple;
public interface IFactory {
     Shape createShape();
}
2.增加具体的工厂实现类
package mode.factory.simple;
public class LineFactory implements IFactory{
    @Override
    public Shape createShape() {
        return new Line();
    }
}
package mode.factory.simple;
public class TriangleFactory implements IFactory{
    @Override
    public Shape createShape() {
        return new Triangle();
    }
}
3.把简单工厂模式中的逻辑移出来,改到Test类
package mode.factory.simple;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test2 {
	public static void main(String[] args) {
		System.out.println("Input Shape No.:");
		BufferedReader br = new BufferedReader(new InputStreamReader((System.in)));
		int shapeNum = -1;
		try {
			shapeNum = Integer.parseInt(br.readLine());
		} catch (NumberFormatException e) {
			System.err.println("Can not recognize this shape");
		} catch (IOException e) {e.printStackTrace();}
		
		IFactory shapeFac = null;
		switch(shapeNum){
		case 1:shapeFac = new LineFactory(); break;
		case 2:shapeFac = new TriangleFactory(); break;
		default:
		}
		Shape shape = shapeFac.createShape();
		shape.draw();
	}
}
这样做的好处真的是显而易见,更好维护了。这种是工厂方法模式,工厂方法模式里包含抽象工厂,具体工厂,抽象产品,具体产品,抽象工厂定义规范,具体生产由具体工厂完成,可以看出,把简单工厂模式中的工厂类里的逻辑移出到客户端,使其耦合度更低,便于更好维护。加功能的话只需要改客户端即可。 工厂方法模式的改进就是抽象工厂模式了
3.抽象工厂模式:
例子没想出来,但抽象工厂也是根据工厂方法进化的, 工厂方法针对的是一个产品结构;而抽象工厂模式则需要面对多个产品,抽象工厂就是在工厂方法的基础上进一步推广,抽象工厂不好的地方是增加一个产品需要增加的类很多,一些常用的技巧就是利用简单工厂来改造,也常用反射和配置文件来简化代码。

大话设计模式抽象工厂的最终类图:




转载于:https://my.oschina.net/wrean/blog/149605

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值