ceacer 2 已发布 1月30号 分享 已发布 1月30号 工厂模式是软件设计中最常用也最常见的一种模式,这里通过一个例子来说明其功能。 Table of Contents 问题背景 用户需求:请提供 1)、图形绘制功能,当前可绘制当前可绘制原型、方形、三角形。未来可能需要支持绘制菱形、梯形等形状。2)、图形可以提供一些其他的方法,比如绘制、染色、描边等 系统设计 依据上面的需求,我们很自然的会想到以下设计点: 定义接口类,该类定义了对用户提供的方法,比如绘制、染色、描边等。 接口实现类,依据不同的图形来实现接口。 上面两点设计,完全可以实现用户需求。 但它有一个劣势:用户需要记住每个图形的实现类。随着增加新图形,或者更改当前使用的图形时,用户都需要不断实例化新的类。 此时,我们可以通过工厂模式来降低用户使用接口的复杂度。 即,我们提供一个工厂类,用户只需要输入图形类型即可获取到该图形的实例。用户不再需要记忆每个图形对应的类名。 所以,工厂模式是为了降低用户使用接口复杂度而出现的一个钟设计模式。 编码实现 首先,定义个接口类 // 暴露给用户的接口类 public interface IShape { void draw(); // 提供给用户的方法 } 其次,实现一个工厂,该工厂提供图形实例给用户 // 暴露给用户的工厂类,用户提供图形类型,即可通过该类获取图形实例。 public class ShapeFactory { // 返回值为接口定义 public IShape create(String id) { if (id == null) {// 类型异常检测 throw new IllegalArgumentException("id is null"); } if ("Circle".equals(id)) { return new Circle(); } if ("Rectangle".equals(id)) { return new Rectangle(); } if ("Triangle".equals(id)) { return new Triangle(); }// 类型异常检测 throw new IllegalArgumentException("Unknow id = "+id); } } 最后,实现工厂实体内容,即实现图形类。这里用圆形类举例,其它类不一一例句。 // 图形类,圆型类。用户通过工厂类可以获取该类的实例 public class Circle implements IShape { @Override public void draw() { System.out.println("draw a Circle"); } } 如上,清晰明了的说明了工厂模式的作用,及实现方法。 如果对例子感兴趣,可以私信我。 评论链接 在其他网站上分享 更多分享选项...
推荐帖
创建账户或登录以发表评论
您需要成为会员才能发表评论
创建一个帐户
在我们的社区注册一个新账户。很简单!
注册新账户登入
已有账户?在此登录
立即登录