Java设计模式-工厂模式

工厂模式

  • Java里边共有23种设计模式而工厂模式就有三种,它们分别是简单工厂模式(并不在23种模式之中),工厂方法模式以及抽象工厂模式,其中我们通常所说的工厂模式指的是工厂方法模式,工厂方法模式是日常开发中使用频率最高的一种设计模式,甚至在很多源码中也是随处可见。

简单工厂模式

  • 简单工厂模式并不算是一种设计模式,更多的时候是一种编程习惯。

什么是简单工厂模式?

  • 定义一个工厂类,根据传入的参数不同返回不同的实例,被创建的实例具有共同的父类或接口

  • 适用场景:

    • 需要创建的对象较少
    • 客户端不关心对象的创建过程
  • 工产类示例

        public class ShapeFactory {
          public static final String TAG = "ShapeFactory";
          public static Shape getShape(String type) {
              Shape shape = null;
              if (type.equalsIgnoreCase("circle")) {
                  shape = new CircleShape();
              } else if (type.equalsIgnoreCase("rect")) {
                  shape = new RectShape();
              } else if (type.equalsIgnoreCase("triangle")) {
                  shape = new TriangleShape();
              }
              return shape;
          }
        }
  • 客户端使用
        Shape shape= ShapeFactory.getShape("circle");
        shape.draw();

工厂方法模式

  • 工产方法模式是简单工厂的进一步深化。在工厂方法模式中,我们不再提供一个统一个工厂类来创建所有的对象,而是针对不同的对象提供不同的工厂。也就是说每个对象都有一个与之对应的工厂。

  • 定义:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。

  • 适用场景:

    • 客户端不需要知道它所创建的对象的类
    • 客户端可以通过子类来指定创建对应的对象

实例:

  • 现在需要设计一个这样的图片加载类,它具有多个图片加载器,用来加载jpg,png,gif格式的图片,每个加载器都有一个read()方法,用于读取图片。下面我们完成这个图片加载类。

  • 首先完成图片加载器的设计,编写一个加载器的公共接口。

        public interface Reader {
            void read();
        }
  • Reader 里面只有一个read()方法,然后完成各个图片加载器的代码。

  • Jpg图片加载器

        public class JpgReader implements Reader {
            @Override
            public void read() {
                System.out.print("read jpg");
            }
        }
  • Png图片加载器
        public class PngReader implements Reader {
            @Override
            public void read() {
                System.out.print("read png");
            }
        }
  • Gif图片加载器
        public class GifReader implements Reader {
            @Override
            public void read() {
                System.out.print("read gif");
            }
        }
  • 现在我们按照定义所说定义一个抽象的工厂接口ReaderFactory
        public interface ReaderFactory {
            Reader getReader();
        }
  • 里面有一个getReader()方法返回我们的Reader 类,接下来我们把上面定义好的每个图片加载器都提供一个工厂类,这些工厂类实现了ReaderFactory 。

  • Jpg加载器工厂

        public class JpgReaderFactory implements ReaderFactory {
            @Override
            public Reader getReader() {
                return new JpgReader();
            }
        }
  • Png加载器工厂
        public class PngReaderFactory implements ReaderFactory {
            @Override
            public Reader getReader() {
                return new PngReader();
            }
        }
  • Gif加载器工厂
        public class GifReaderFactory implements ReaderFactory {
            @Override
            public Reader getReader() {
                return new GifReader();
            }
        }
  • 在每个工厂类中我们都通过复写的getReader()方法返回各自的图片加载器对象。

  • 客户端使用

  • 读取Jpg

        ReaderFactory factory=new JpgReaderFactory();
        Reader  reader=factory.getReader();
        reader.read();
  • 读取Png
        ReaderFactory factory=new PngReaderFactory();
        Reader  reader=factory.getReader();
        reader.read();
  • 读取Gif
        ReaderFactory factory=new GifReaderFactory();
        Reader  reader=factory.getReader();
        reader.read();

抽象工厂模式

  • 因为这个模式在实际应用中局限性很大,而且不符合开闭原则,所以这里不做太多介绍

  • 抽象工厂模式是工厂方法的进一步深化,在这个模式中的工厂类不单单可以创建一个对象,而是可以创建一组对象。

  • 定义:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值