工廠模式

1類圖

這裏寫圖片描述

2定義:

一個用於創建對象的接口,讓子類決定實例化那個類

3使用場景

  • 需要生成複雜的對象。
  • 用new就可以創建的對象無需使用工廠模式。

4具體實現

  • 1抽象產品類
public abstract class Product {
    public abstract void method();
}
  • 2具體產品A類
public class ConcreteProductA extends Product {

    @Override
    public void method() {
        // TODO Auto-generated method stub
        System.out.println("A");
    }

}
  • 3具體產品B類
public class ConcreteProductB extends Product {

    @Override
    public void method() {
        // TODO Auto-generated method stub
        System.out.println("B");
    }

}
  • 4抽象工廠類
public abstract class Factory {
    public abstract Product createProduct();
    //public abstract<T extends Product> T createProduct(Class<T> clz);
}
  • 5具體工廠類
public class ConcreteFactory extends Factory{

    @Override
    public Product createProduct() {
        // TODO Auto-generated method stub
        //創建ConcreteProductA();
        return new ConcreteProductA();
        //return new ConcreteProductB();
    }

}
  • 客戶類
public class Client {
    public static void main(String[] args) {
        Factory factory = new ConcreteFactory();
        Product product = factory.createProduct();
        //Product product = factory.createProduct(ConcreteProductB.class);
        product.method();
    }
}

5利用反射的方式決定創建那個產品類的實例

  • 更改抽象工廠類
public abstract class Factory {
    //public abstract Product createProduct();
    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) {
        // TODO Auto-generated method stub
        Product p = null;
        try {
            p = (Product) Class.forName(clz.getName()).newInstance();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return (T)p;
    }
/*
    @Override
    public Product createProduct() {
        // TODO Auto-generated method stub
        //創建ConcreteProductA();
        return new ConcreteProductA();
        //return new ConcreteProductB();
    }*/

}
  • 客戶類
public class Client {
    public static void main(String[] args) {
        Factory factory = new ConcreteFactory();
        //Product product = factory.createProduct();
        Product product = factory.createProduct(ConcreteProductB.class);
        product.method();
    }
}

6每個產品都具體化抽象工廠類

  • 創建產品A的具體工廠類
public class ConcreteFactoryA extends Factory {

    @Override
    public Product createProduct() {
        // TODO Auto-generated method stub
        return new ConcreteProductA();
    }


}
  • 創建產品B的具體工廠類
public class ConcreteFactoryB extends Factory {

    @Override
    public Product createProduct() {
        // TODO Auto-generated method stub
        return new ConcreteProductB();
    }

}
  • 客戶類
public class Client {
    public static void main(String[] args) {
        //Factory factory = new ConcreteFactory();
        //Product product = factory.createProduct();
        //Product product = factory.createProduct(ConcreteProductB.class);
        //product.method();

        Factory factory = new ConcreteFactoryA();
        Product productA = factory.createProduct();
        productA.method();

    }
}
發佈了51 篇原創文章 · 獲贊 12 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章