博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面向对象-工厂模式
阅读量:6692 次
发布时间:2019-06-25

本文共 3047 字,大约阅读时间需要 10 分钟。

  hot3.png

工厂模式有简单工厂模式,工厂方法模式,抽象工厂模式。
简单工厂模式:根据传入的参数决定出哪个对象,感觉上似乎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

你可能感兴趣的文章
Java 线程池框架核心代码分析
查看>>
第六次作业:素数判断及求和
查看>>
「学习笔记——Linux」Linux软件管理(RPM,Dpkg,APT)
查看>>
Soft NMS
查看>>
Linux命令的那些事(二)
查看>>
强制转https
查看>>
Ubuntu下GTK的安装、编译和测试
查看>>
javascript中window.open()与window.location.href的区别
查看>>
Respond.js的作用
查看>>
FCN笔记(Fully Convolutional Networks for Semantic Segmentation)
查看>>
外部线程停止Java子线程的方法
查看>>
OpenMP并行编程
查看>>
网络编程
查看>>
【ZJOI2016】线段树
查看>>
ActiveMQ-自定义用户验证
查看>>
IOS 项目加入SDL库 --- FFMPEG+SDL学习 之 二
查看>>
mysql的sql文件的备份与还原
查看>>
Java API —— 泛型
查看>>
十三周进度报告
查看>>
「APIO2018」选圆圈
查看>>