1類圖
2定義:
一個用於創建對象的接口,讓子類決定實例化那個類
3使用場景
- 需要生成複雜的對象。
- 用new就可以創建的對象無需使用工廠模式。
4具體實現
public abstract class Product {
public abstract void method();
}
public class ConcreteProductA extends Product {
@Override
public void method() {
System.out.println("A");
}
}
public class ConcreteProductB extends Product {
@Override
public void method() {
System.out.println("B");
}
}
public abstract class Factory {
public abstract Product createProduct();
}
public class ConcreteFactory extends Factory{
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
public class Client {
public static void main(String[] args) {
Factory factory = new ConcreteFactory();
Product product = factory.createProduct();
product.method();
}
}
5利用反射的方式決定創建那個產品類的實例
public abstract class Factory {
public abstract<T extends Product> T createProduct(Class<T> clz);
}
public class ConcreteFactory extends Factory{
@Override
public <T extends Product> T createProduct(Class<T> clz) {
Product p = null;
try {
p = (Product) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T)p;
}
}
public class Client {
public static void main(String[] args) {
Factory factory = new ConcreteFactory();
Product product = factory.createProduct(ConcreteProductB.class);
product.method();
}
}
6每個產品都具體化抽象工廠類
public class ConcreteFactoryA extends Factory {
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
public class ConcreteFactoryB extends Factory {
@Override
public Product createProduct() {
return new ConcreteProductB();
}
}
public class Client {
public static void main(String[] args) {
Factory factory = new ConcreteFactoryA();
Product productA = factory.createProduct();
productA.method();
}
}