設計模式-工廠模式

工廠模式的定義

Define an interface for creating an object, but let sub let subclasses decide which class to instantiate Factory Methods lets a class defer instantiation to subclasses(定義一個用戶建立對象的接口,讓子類決定實例化哪個類。工廠方法使一個類的實例化到其實例)ide

工廠模式類圖
工廠模式類圖
1.抽象產品類spa

public abstract class Product {
    //產品類的公共方法
    public void method1(){
        //業務邏輯處理
    }
    //抽象方法
    public abstract void method2();
}

2.具體產品類code

public class ConcreateProduct1 extends Product {
    public void method2() {
        //業務邏輯處理
    }
}

public class ConcreteProduct2 extends Product {
    public void method2(){
    }
}

3.抽象工廠類對象

public abstract class Creator {
    //建立一個產品對象,其輸入參數能夠自行設置
    //一般爲String、Enum、Class等,固然也能夠爲空
    public abstract <T entends Product> T createProduct(Class<T> c)
}

4.具體工廠類接口

public class ConcreteCreator extends Creator {
    public <T extends Product> T createProduct(Class<T> c){
        Product product = null;
        try{
            product = (Product)Class.forName(c.getName()).newInstance();
        }catch(Exception e){
            //異常處理
        }
        return (T)product;
    }
}

5.場景類ci

public class Client {
    public static void main(String[] args){
        Creator creator = new ConcreteCreator();
        Product product = creator.createProduct(ConcreteProduct1.class);
        //繼續業務處理
    }
}

簡單工廠模式(也叫靜態工廠模式)

將抽象工廠類剔除,將具體工廠類的建立產品的方法變爲靜態get

多工廠模式

不一樣的產品將由不一樣的工廠類建立產品

替代單例模式

1.單例類io

public class Singleton {
    //不容許經過new產生一個對象
    private Singleton() {
    }
    public void doSomething() {
        //業務處理
    }
}

2.負責生成單例的工廠類class

public class SingletonFactory {
    private static Singleton signleton;
    static{
        try{
            Class c1 = Class.forName(Singleton.class.getName());
            //得到無參構造
            Constructor constructor = c1.getDeclaredConstructor();
            //設置無參構造是可訪問的
            constructor.setAccessible(true);
            //產生一個實例對象
            singleton = (Singleton)constructor.newInstance();
        }catch (Exception e){
            //異常處理
        }
    }
    public static Singleton getSingleton(){
        return singleton;
    }
}
相關文章
相關標籤/搜索