簡單工廠模式,
定義一個工廠類,根據傳入的參數返回不同的實例,被創建的實例有共同的父類或者接口,
適用的場景:
- 工廠類中可創建的對象不能太多,否則工廠類中的業務邏輯太複雜。
- 客戶端不關心對象的創建過程
實例:可以創建三角形、正方形、等帶有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();
}
}