工厂模式
- 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();
抽象工厂模式
-
因为这个模式在实际应用中局限性很大,而且不符合开闭原则,所以这里不做太多介绍
-
抽象工厂模式是工厂方法的进一步深化,在这个模式中的工厂类不单单可以创建一个对象,而是可以创建一组对象。
-
定义:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。