設計模式之工廠模式

                                               工廠模式

三種工廠:簡單工廠模式、工廠方法模式、抽象工廠模式。

 

簡單工廠模式:

簡單工廠模式:用戶可以通過工廠得到自己需要的產品,比如說通過通過工廠得到一雙鞋,鞋子有耐克,adidas等。

public class Customer {
    public static void main(String[] args) {
        Factory factory = new Factory();
        factory.createShoes("Nike");
        factory.createShoes("Adidas");
    }
}

public class Factory {

    public Shoes createShoes(String name) {
        switch (name) {
            case "Nike":
                return new Nike();
            case "Adidas":
                return new Adidas();
            default:
                break;
        }
        return null;
    }
}

abstract class Shoes {
    public Shoes() {

    }
}

public class Nike extends Shoes {
    public Nike() {
        System.out.println("製造一雙Nike");
    }
}

public class Adidas extends Shoes {
    public Adidas() {
        System.out.println("製造一雙Adidas");
    }
}

 

可以看出,簡單工廠模式的擴展性不佳,如果要增加一種鞋子,需要另加一個類,同時switch中也要加上對應的種類。

 

工廠方法模式:

工廠方法模式在需要擴展時不會在工廠類中新增代碼,只會新增一個具體的工廠實現類。

public class Customer {
    public static void main(String[] args) {
        // 特定的工廠製造特定的鞋子。
        FactoryShoesNike factoryShoesNike = new FactoryShoesNike();
        factoryShoesNike.createShoes();
        FactoryShoesAdidas factoryShoesAdidas = new FactoryShoesAdidas();
        factoryShoesAdidas.createShoes();
    }
}


//工廠父類提供造鞋方法
interface Factory {
    Shoes createShoes();
}

//具體的工廠實現製造過程
public class FactoryShoesNike implements Factory {
    @Override
    public Nike createShoes() {
        return new Nike();
    }
}

public class FactoryShoesAdidas implements Factory {
    @Override
    public Adidas createShoes() {
        return new Adidas();
    }
}

abstract class Shoes {
    public Shoes() {
        
    }
}

public class Nike extends Shoes {
    public Nike() {
        System.out.println("製造一雙Nike");
    }
}

public class Adidas extends Shoes {
    public Adidas() {
        System.out.println("製造一雙Adidas");
    }
}

抽象工廠模式:

隨着需求的增加,同一款鞋子會出現不同的特徵,比如說鞋的氣墊會不一樣,鞋的鞋面材質會不一樣等等。這時候就需要就需要氣墊,材質這樣的產品基類。

public class Customer {
    public static void main(String[] args) {
        // 每雙鞋的氣墊和材質都不一樣
        FactoryShoesAdidas factoryShoesAdidas = new FactoryShoesAdidas();
        factoryShoesAdidas.createAirCushion();
        factoryShoesAdidas.createMaterial();

        FactoryShoesNike factoryShoesNike = new FactoryShoesNike();
        factoryShoesNike.createAirCushion();
        factoryShoesNike.createMaterial();
    }
}

// 工廠類
interface Factory {
    public AirCushion createAirCushion();

    public Material createMaterial();
}

public class FactoryShoesAdidas implements Factory {
    @Override
    public AirCushion createAirCushion() {
        return new AirCushionA();
    }

    @Override
    public Material createMaterial() {
        return new MaterialA();
    }
}

public class FactoryShoesNike implements Factory {
    @Override
    public AirCushion createAirCushion() {
        return new AirCushionB();
    }

    @Override
    public Material createMaterial() {
        return new MaterialB();
    }
}


//產品基類
public class AirCushion {

}

public class AirCushionA extends AirCushion{
    public AirCushionA() {
        System.out.println("製造氣墊A");
    }
}

public class AirCushionB extends AirCushion{
    public AirCushionB() {
        System.out.println("製造氣墊B");
    }

}

public class Material {
}

public class MaterialA extends Material{
    public MaterialA() {
        System.out.println("使用A材料");
    }
}

public class MaterialB extends Material{
    public MaterialB() {
        System.out.println("使用B材料");
    }
}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章