简单工厂模式,
定义一个工厂类,根据传入的参数返回不同的实例,被创建的实例有共同的父类或者接口,
适用的场景:
- 工厂类中可创建的对象不能太多,否则工厂类中的业务逻辑太复杂。
- 客户端不关心对象的创建过程
实例:可以创建三角形、正方形、等带有draw 方法的类
// 接口
public interface Shape {void draw();}
// 各个形状的实现
public class CircleShape implements Shape {
public CircleShape() { System.out.println("Circle construct"); }
@Override
public void draw() {System.out.println("a Circle");}
}
public class RectShape implements Shape {
public RectShape() { System.out.println("a react"); }
@Override
public void draw() {System.out.println("a react");}
}
public class TriangleShape implements Shape {
public TriangleShape() { System.out.println("triangle construct"); }
@Override
public void draw() {System.out.println("a triangle");}
}
// 工厂类
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;
}
}
// 使用工厂类
public class CreateShape {
public static void main(String[] args) {
Shape circle = ShapeFactory.getShape("circle");
circle.draw();
}
}
工厂方法模式
这种模式中,我们不再提供一个统一的工厂类来创建所有的对象,而是正对不同的对象提供不同的工厂,也就是说每个对象都有一个对应的工厂。
实例:图片加载类,它具有多个图片加载器,用来加载jpg,png,gif格式的图片,每个加载器都有一个read()方法,用于读取图片
// reader 接口类
public interface Reader { void Read();}
// 各个格式的reader
public class GifReader implements Reader {
@Override
public void Read() {System.out.println("GifReader..");}
}
public class JpgReader implements Reader {
@Override
public void Read() {System.out.println("JpgReader..");}
}
// 工厂接口类
public interface ReaderFactory { Reader getReader();}
// 工厂接口类的实现
public class GifReaderFactory implements ReaderFactory {
@Override
public Reader getReader() {return new GifReader();}
}
public class JpgReaderFactory implements ReaderFactory {
@Override
public Reader getReader() {return new JpgReader();}
}
创建类
public class createFactory {
public static void main(String[] args) {
JpgReaderFactory factory = new JpgReaderFactory();
Reader reader = factory.getReader();
reader.Read();
PngReaderFactory factory1 = new PngReaderFactory();
Reader reader1 = factory1.getReader();
reader1.Read();
}
}