工廠模式(思惟導圖)

 

圖1 工廠模式【點擊查看大圖】編程

  在面向對象編程中, 最一般的方法是一個new操做符產生一個對象實例,new操做符就是用來構造對象實例的。可是在一些狀況下, new操做符直接生成對象會帶來一些問題。舉例來講, 許多類型對象的創造須要一系列的步驟: 你可能須要計算或取得對象的初始設置; 選擇生成哪一個子對象實例; 或在生成你須要的對象以前必須先生成一些輔助功能的對象。 在這些狀況,新對象的創建就是一個 「過程」,不只是一個操做,像一部大機器中的一個齒輪傳動。

設計模式

1,非工廠模式

  自產自用,須要什麼東西本身動手作的田園經濟。網絡

輔助函數:ide

package com.cnblogs.mufasa.Demo2;

public interface IMessage {
    final static String VALUE="接口中的常量數據";
    public void send();
    public void send(String message);
}

public interface IService {
    public void service();
}

public class NetMessage implements IMessage {
    private String message;
    public NetMessage(){
        this.message="無參構造";
    }
    public NetMessage(String message){
        this.message=message;
    }


    public void send() {
        System.out.println(this.message+"。。。輸出");
    }
    public void send(String str) {
        System.out.println(str+this.getVALUE());
    }

    public String getVALUE(){
        return this.VALUE;
    }
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
View Code

非工廠的對象實例化:函數

package com.cnblogs.mufasa.Demo2;

public class Demo1 {
    public static void main(String[] args) throws Exception {
        IMessage msg=new NetMessage("成功");//若是直接實例化必定會有
        msg.send();
        msg.send("hello");
    }
}
/*輸出
【網絡消息發送】www.cnblogs.com
 */

 

2,簡單工廠模式(Simple Factory) 

  市場經濟的初級階段,這個工廠只能生產特定不變的東西。【靜態工廠】this

package com.cnblogs.mufasa.Demo2;

/**
 * 靜態工廠類:添加新的子類須要追加修改,標記
 */
public class Factory {
    private Factory(){}//沒有產生實例化對象的意義,因此構造方法私有化
    public static IMessage getInstance(String className){
        if("netmessage".equalsIgnoreCase(className)){
            return new NetMessage();
        }
        return null;
    }
}

簡單工廠實例化:spa

package com.cnblogs.mufasa.Demo2;

public class Demo2 {
    public static void main(String[] args) throws Exception {
        IMessage msg=Factory.getInstance("NetMessage");//標準的工廠設計模式
        msg.send();
    }
}
/*輸出
【網絡消息發送】www.cnblogs.com
 */

 

3,工廠方法模式(Factory Method) 

package com.cnblogs.mufasa.demo1;

import com.cnblogs.mufasa.demo1.IMessage;

public interface IFactory {
    IMessage getInstance();
}

class FactoryNetMessage implements IFactory{
    @Override
    public NetMessage getInstance() {
        return new NetMessage();
    }
}

 

package com.cnblogs.mufasa.demo1;

public class Demo1 {
    public static void main(String[] args) {
        FactoryNetMessage factoryNetMessage=new FactoryNetMessage();
        NetMessage netMessage=factoryNetMessage.getInstance();
        netMessage.send("工廠方法-");

    }
}

 

4,抽象工廠模式(Abstract Factory) 

   將功能進行細分.net

package com.cnblogs.mufasa.Demo3;

public interface IFactory {
    public IMessage getMessage();
    public IService getService();
}

class Factory1 implements IFactory{
    @Override
    public IMessage getMessage() {
        return new NetMessage();
    }

    @Override
    public IService getService() {
        return new HouseService();
    }
}

class Factory2 implements IFactory{
    @Override
    public IMessage getMessage() {
        return new NetMessage();
    }

    @Override
    public IService getService() {
        return new HouseService();
    }
}

 

5,反射實現的動態工廠模式

package com.cnblogs.mufasa.demo2;

//反射實現的動態工廠類
public class Factory2 {
    private Factory2(){}
    public static IMessage getInstance(String className) throws Exception {
        IMessage instance=null;
        try{//動態工廠類
            instance=(IMessage) Class.forName(className).getDeclaredConstructor().newInstance();
        }catch (Exception e){
            e.printStackTrace();
        }
        return instance;
    }
}

 

6,反射&泛型實現的動態工廠模式

package com.cnblogs.mufasa.demo2;

public class Factory3 {
    private Factory3(){}

    /**
     * 獲取接口實例化對象
     * @param className 接口的子類
     * @param tClass    描述的是一個接口的類型
     * @param <T>       接口的類型【泛型】
     * @return          若是子類存在則返回指定接口的實例化對象
     * @throws Exception
     */
    public static <T> T getInstance(String className,Class<T> tClass) throws Exception {
        T instance=null;
        try{//動態工廠類
            instance=(T) Class.forName(className).getDeclaredConstructor().newInstance();
        }catch (Exception e){
            e.printStackTrace();
        }
        return instance;
    }
}

 

原文連接:https://blog.csdn.net/jason0539/article/details/23020989設計

原文連接:https://blog.csdn.net/jason0539/article/details/44976775code

相關文章
相關標籤/搜索