简单工厂模式

简单工厂模式的动机

简单工厂模式主要应用在简历大量功能相似的类时。比如在界面上,按钮需要具有相同的画风、外观等等,但是具体的功能不一样。也就是类型相似,但是功能不同(也就是通常拥有相同的父类)。如果使用普通的new对象来创建,将会出现大量的new对象。通常使用一个工厂类来进行创建具体的类。

模式定义

简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类

模式的结构

简单工厂的角色

工厂模式的 UML 图

代码分析
 
 
  1. Shape.java
  2. public interface Shape {
  3. void draw();
  4. }
  5. Circle.Java
  6. public class Circle implements Shape {
  7. @Override
  8. public void draw() {
  9. System.out.println("i am a circle");
  10. }
  11. }
  12. Square.java
  13. public class Square implements Shape {
  14. @Override
  15. public void draw() {
  16. System.out.println("I am a Square");
  17. }
  18. }
  19. ShapeFactory.java
  20. public class ShapeFactory {
  21. public static Shape create(String shapeType){
  22. if (shapeType == "square"){
  23. return new Square();
  24. } else{
  25. return new Circle();
  26. }
  27. }
  28. public static void main(String[] args) {
  29. Shape shape = ShapeFactory.create("square");
  30. shape.draw();
  31. }
  32. }

简单工厂模式的意义

  • 简单工厂模式的本质仍然是根据传入的值创建对象,通过不断的if或者else if来判断需要创建的对象
  • 简单工厂模式最大的问题在于工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,这一点与开闭原则是相违背的。
  • 简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。
  • 简单工厂将同一接口下的类进行统一创建,将创建与使用进行解耦,降低了组件之间的依赖性,对象的业务不依赖于他的对象而是依赖于工厂和统一的接口,工厂基于不同的对象进行调度,如果需要返回别的对象,可以只需要修改工厂类,而不需要找到所有的业务实现中的调用,使对象的创建更加灵活

简单工厂的使用情景

  • 首先因为简单工厂需要不停的进行判断,所以如果需要创建的类太多,工厂方法就会进行复杂的逻辑判断或者长时间的进行匹配,程序运行效率较低
  • 需要对调用方隐藏创建方式

JDK中的应用实例

  • dateformat中使用了工厂方式进行创建

       
       
    1. Dateformat
    2. private static DateFormat get(int timeStyle, int dateStyle,
    3. int flags, Locale loc) {
    4. if ((flags & 1) != 0) {
    5. if (timeStyle < 0 || timeStyle > 3) {
    6. throw new IllegalArgumentException("Illegal time style " + timeStyle);
    7. }
    8. } else {
    9. timeStyle = -1;
    10. }
    11. if ((flags & 2) != 0) {
    12. if (dateStyle < 0 || dateStyle > 3) {
    13. throw new IllegalArgumentException("Illegal date style " + dateStyle);
    14. }
    15. } else {
    16. dateStyle = -1;
    17. }
    18. LocaleProviderAdapter adapter = LocaleProviderAdapter.getAdapter(DateFormatProvider.class, loc);
    19. DateFormat dateFormat = get(adapter, timeStyle, dateStyle, loc);
    20. if (dateFormat == null) {
    21. dateFormat = get(LocaleProviderAdapter.forJRE(), timeStyle, dateStyle, loc);
    22. }
    23. return dateFormat;
    24. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值