設計模式系列 1——StaticFactory(靜態工廠),AbstractFactory(抽象工廠)

本文出自
代碼大溼
代碼大溼java

本系列持續更新,敬請關注。git

1 靜態工廠

靜態工廠介紹:github

靜態工廠模式能夠實現接口封裝隔離的原則。在客戶端只知接口而不知實現的時候能夠使用靜態工廠模式。

源碼請點擊我設計模式

角色:ide

Product:客戶端須要使用的接口。 

ConcreteProduct:Product的具體實現。

Factory:擁有靜態方法的工廠類,返回ConcreteProduct實例。

Client:只知到Product。可是並不知道具體實現。

UML:this

這裏寫圖片描述

code:.net

package 設計模式.staticFactary;
/*
 *2016年8月26日    上午10:15:22
 *@Author Pin-Wang
 *@E-mail 1228935432@qq.com
*/
public interface Product {
    public void operation();

}
package 設計模式.staticFactary;
/*
 *2016年8月26日    上午10:15:00
 *@Author Pin-Wang
 *@E-mail 1228935432@qq.com
*/
public class ConcreteProduct implements Product{

    @Override
    public void operation() {
        System.out.println("我是具體產品中的實現方法");
    }
}
package 設計模式.staticFactary;
/*
 *2016年8月26日    上午10:47:01
 *@Author Pin-Wang
 *@E-mail 1228935432@qq.com
*/
public class Factory {
    public static Product getProduct(){
        return new ConcreteProduct();
    }
}
package 設計模式.staticFactary;
/*
 *2016年8月26日    上午10:48:05
 *@Author Pin-Wang
 *@E-mail 1228935432@qq.com
*/
public class Client {

    public static void main(String[] args) {
        Product product=Factory.getProduct();
        product.operation();
    }
}

2 AbstractFactory(抽象工廠)

AbstractFactory介紹:設計

AbstractFactory是爲一系列相關的或者相互依賴的類建立接口,客戶端不用關注他們的實現。至關如一個AbstractFactory的實現建立一個產品族。

AbstractFactory角色:code

abstractProduct:抽象產品類。
ConcreteProduct:具體的產品實現。
abstractFactory:抽象工廠。
ConcreteFactory:具體的工廠實現。

UML:
這裏寫圖片描述blog

源碼點擊我

場景:選用不一樣的方案來裝機,主要是讓cpu和主板配套。

code:

abstractProduct

package 設計模式.abstractFactory;
/*
 *2016年9月2日 上午10:18:46
 *@Author Pin-Wang
 *@E-mail 1228935432@qq.com
*/
public interface CpuAPI {
    public  void calculate();

}

abstractProduct

package 設計模式.abstractFactory;
/*
 *2016年9月2日 上午10:18:46
 *@Author Pin-Wang
 *@E-mail 1228935432@qq.com
*/
public interface MainBoardAPI {
    void install();
}

ConcreteProduct

package 設計模式.abstractFactory;
/*
 *2016年9月2日 上午10:20:38
 *@Author Pin-Wang
 *@E-mail 1228935432@qq.com
*/
public class IntellCpu implements CpuAPI{
    Integer cpuPins;
    public IntellCpu(Integer pins) {
        cpuPins=pins;
    }
    @Override
    public void calculate() {
        System.out.println("Intell cpu 正在計算....."+"pins:"+cpuPins);
    }

}

ConcreteProduct

package 設計模式.abstractFactory;
/*
 *2016年9月2日 上午10:20:38
 *@Author Pin-Wang
 *@E-mail 1228935432@qq.com
*/

public class AMDCpu implements CpuAPI{
    Integer cpuPins;
    public AMDCpu(Integer pins) {
        cpuPins=pins;
    }
    @Override
    public void calculate() {
        System.out.println("AMD cpu 正在計算....."+"pins:"+cpuPins);
    }

}
package 設計模式.abstractFactory;
/*
 *2016年9月2日 上午10:24:25
 *@Author Pin-Wang
 *@E-mail 1228935432@qq.com
*/

ConcreteProduct
//技嘉主板
public class GigaMainboard implements MainBoardAPI{
    //插入cpu的接口pin數
    Integer pins ;
    public GigaMainboard(Integer pins) {
        this.pins=pins;
    }
    
    @Override
    public void install() {
        System.out.println("技嘉主板正在安裝.....pin數:"+pins);
    }
    
}

ConcreteProduct

package 設計模式.abstractFactory;
/*
 *2016年9月2日 上午10:24:25
 *@Author Pin-Wang
 *@E-mail 1228935432@qq.com
*/


//微星主板
public class MSIMainboard implements MainBoardAPI{
    //插入cpu的接口pin數
    Integer pins ;
    public MSIMainboard(Integer pins) {
        this.pins=pins;
    }
    
    @Override
    public void install() {
        System.out.println("微星主板正在安裝.....pin數:"+pins);
    }
    
}

AbstractFactory

package 設計模式.abstractFactory;
/*
 *2016年9月2日 上午10:29:07
 *@Author Pin-Wang
 *@E-mail 1228935432@qq.com
*/
public interface AbstractFactory {
    CpuAPI createCPU();
    MainBoardAPI createMainBoardAPI();
}

ConcreteFactory

package 設計模式.abstractFactory;
/*
 *2016年9月2日 上午10:31:01
 *@Author Pin-Wang
 *@E-mail 1228935432@qq.com
*/
public class ConcreteFactoryA implements AbstractFactory{

    @Override
    //intell cpu
    public CpuAPI createCPU() {
        return new IntellCpu(1156);
    }

    //技嘉主板
    @Override
    public MainBoardAPI createMainBoardAPI() {
        return new GigaMainboard(1156);
    }
    

}

ConcreteFactory

package 設計模式.abstractFactory;
/*
 *2016年9月2日 上午10:31:01
 *@Author Pin-Wang
 *@E-mail 1228935432@qq.com
*/
public class ConcreteFactoryB implements AbstractFactory{

    @Override
    //AMD cpu
    public CpuAPI createCPU() {
        return new AMDCpu(939);
    }

    //微星主板
    @Override
    public MainBoardAPI createMainBoardAPI() {
        return new MSIMainboard(939);
    }
    

}

Client

package 設計模式.abstractFactory;

/*
 *2016年9月2日 上午10:39:15
 *@Author Pin-Wang
 *@E-mail 1228935432@qq.com
*/
public class Engineer {
    AbstractFactory schemal;

    public Engineer(AbstractFactory schemal) {
        this.schemal = schemal;
    }

    public void setSchemal(AbstractFactory schemal) {
        this.schemal = schemal;
    }

    public void makeAndUseComputer(){
        CpuAPI cpu=schemal.createCPU();
        MainBoardAPI mainBoard=schemal.createMainBoardAPI();
        cpu.calculate();
        mainBoard.install();
    }

}
package 設計模式.abstractFactory;

import static org.junit.Assert.*;

import java.nio.channels.NonWritableChannelException;

import javax.swing.border.AbstractBorder;

import org.junit.Test;

/*
 *2016年9月2日 上午10:35:51
 *@Author Pin-Wang
 *@E-mail 1228935432@qq.com
*/
public class Client {

    @Test
    public void test() {
        System.out.println("裝機方案A");
        //裝機模式1
        AbstractFactory schemalA=new ConcreteFactoryA();
        Engineer engineer=new Engineer(schemalA);
        engineer.makeAndUseComputer();
        
        System.out.println("裝機方案B");
        //裝機模式2
        AbstractFactory schemalB=new ConcreteFactoryB();
        engineer.setSchemal(schemalB);
        engineer.makeAndUseComputer();
    }

}

output:

裝機方案A
Intell cpu 正在計算.....pins:1156
技嘉主板正在安裝.....pin數:1156
裝機方案B
AMD cpu 正在計算.....pins:939
微星主板正在安裝.....pin數:939

本文出自
代碼大溼
代碼大溼

歡迎與廣大coder交流技術
QQ:1228935432
WX:WX1228935432
這裏寫圖片描述

相關文章
相關標籤/搜索