1. 程式人生 > 其它 >設計模式(10):JAVA(10):設計模式(3)工廠模式:提供了一種建立物件的最佳方式(3)抽象工廠

設計模式(10):JAVA(10):設計模式(3)工廠模式:提供了一種建立物件的最佳方式(3)抽象工廠

例1 :

package com.woniuxy.j_abstractfactory.a;

// 抽象工廠: 
// 1.減少了工廠方法類,面對產品簇時,類爆炸的反面效果。
// 2.抽象工廠生成的產品簇,就是一系列產品,這些產品之間有邏輯(內在)關係!
// 3.現在想多增加一個產品簇, 表現的很好,很讓人滿意!

interface Food {
    public void eat();
}

interface Drink {
    public void drink();
}

interface Factory {
    Food getFood();
    Drink getDrink();
}

class Hamburger implements Food { @Override public void eat() { System.out.println("漢堡包"); } } class LiangPi implements Food { @Override public void eat() { System.out.println("涼皮!!"); } } class Cola implements Drink { @Override public void drink() { System.out.println(
"可樂,你值得擁有!"); } } class IcePeek implements Drink { @Override public void drink() { System.out.println("冰峰,從小就喝它"); } } class KFCFactory implements Factory { @Override public Food getFood() { return new Hamburger(); } @Override public Drink getDrink() {
return new Cola(); } } class SanQinFactory implements Factory { @Override public Food getFood() { return new LiangPi(); } @Override public Drink getDrink() { return new IcePeek(); } } class Business { public void taste(Factory factory) { Food food = factory.getFood(); Drink drink = factory.getDrink(); System.out.println("評委1:開吃"); food.eat(); drink.drink(); System.out.println("評委1:確實很難吃..."); System.out.println("評委2:開吃"); food.eat(); drink.drink(); System.out.println("評委2:難吃太太..."); System.out.println("評委3:開吃"); food.eat(); drink.drink(); System.out.println("評委3:難吃到家了..."); } } // ======================================================== public class Test { public static void main(String[] args) { Business b = new Business(); b.taste(new KFCFactory()); b.taste(new SanQinFactory()); } } // 缺點: // 你試試,加一個產品等級, 就會“牽一髮 而動全域性”。 說明抽象工廠不適用於產品等級經常變化的情況。 // 如果產品簇中的產品等價是穩定的,則使用抽象工廠才比較何時。反之,還不如使用工廠方法來的更靈活。 // 換一個角度來分析以上程式碼: // 我們都知道,產品就是new出來的物件, 抽象產品就是介面、抽象類。 // 那麼看看現在main方法中,new了誰?? new KFCFactory() , new SanQinFactory() 這2個工廠也可以看做是產品 // 既然是產品,就應該和客戶端解耦,以防產品類名變化,倒置客戶端奔潰!

例2:

package com.woniuxy.j_abstractfactory.b;

// 針對於a包所提出的問題,重構程式碼如下:
interface Food {
    public void eat();
}

interface Drink {
    public void drink();
}

interface Factory {
    Food getFood();
    Drink getDrink();
}

class Hamburger implements Food {
    @Override
    public void eat() {
        System.out.println("漢堡包");
    }
}
class LiangPi implements Food {
    @Override
    public void eat() {
        System.out.println("涼皮!!");
    }
}

class Cola implements Drink {
    @Override
    public void drink() {
        System.out.println("可樂,你值得擁有!");
    }
}
class IcePeek implements Drink {
    @Override
    public void drink() {
        System.out.println("冰峰,從小就喝它");
    }
}

class KFCFactory implements Factory {

    @Override
    public Food getFood() {
        return new Hamburger();
    }

    @Override
    public Drink getDrink() {
        return new Cola();
    }
}

class SanQinFactory implements Factory {

    @Override
    public Food getFood() {
        return new LiangPi();
    }

    @Override
    public Drink getDrink() {
        return new IcePeek();
    }
}


class Business {
    public void taste(Factory factory) {
        Food food = factory.getFood();
        Drink drink = factory.getDrink();
        
        System.out.println("評委1:開吃");
        food.eat();
        drink.drink();
        System.out.println("評委1:確實很難吃...");
        
        
        System.out.println("評委2:開吃");
        food.eat();
        drink.drink();
        System.out.println("評委2:難吃太太...");
        
        System.out.println("評委3:開吃");
        food.eat();
        drink.drink();
        System.out.println("評委3:難吃到家了...");
    }
}


class SimpleFactory {
    private SimpleFactory() {
    }
    
    public static Factory getFactory(int n) {
        Factory f = null;
        switch (n) {
            case 1:
                f = new KFCFactory();
                break;
            case 2:
                f = new SanQinFactory();
                break;
        }
        return f;
    }
}

// ========================================================


public class Test {
    public static void main(String[] args) {
        Business b = new Business();
        b.taste(SimpleFactory.getFactory(1));
        b.taste(SimpleFactory.getFactory(2));
    }
}

// 我們很容易發現,又回到了原點!!! 

例3:

package com.woniuxy.j_abstractfactory.c;

import java.io.InputStream;
import java.util.Properties;
import java.util.concurrent.TimeUnit;

// 針對於a包所提出的問題,重構程式碼如下:

interface Food {
    public void eat();
}

interface Drink {
    public void drink();
}

interface Factory {
    Food getFood();
    Drink getDrink();
}

class Hamburger implements Food {
    @Override
    public void eat() {
        System.out.println("漢堡包");
    }
}
class LiangPi implements Food {
    @Override
    public void eat() {
        System.out.println("涼皮!!");
    }
}

class Cola implements Drink {
    @Override
    public void drink() {
        System.out.println("可樂,你值得擁有!");
    }
}
class IcePeek implements Drink {
    @Override
    public void drink() {
        System.out.println("冰峰,從小就喝它");
    }
}

class KFCFactory implements Factory {

    @Override
    public Food getFood() {
        return new Hamburger();
    }

    @Override
    public Drink getDrink() {
        return new Cola();
    }
}

class SanQinFactory implements Factory {

    @Override
    public Food getFood() {
        return new LiangPi();
    }

    @Override
    public Drink getDrink() {
        return new IcePeek();
    }
}


class Business {
    public void taste(Factory factory) {
        Food food = factory.getFood();
        Drink drink = factory.getDrink();
        
        System.out.println("評委1:開吃");
        food.eat();
        drink.drink();
        System.out.println("評委1:確實很難吃...");
        
        
        System.out.println("評委2:開吃");
        food.eat();
        drink.drink();
        System.out.println("評委2:難吃太太...");
        
        System.out.println("評委3:開吃");
        food.eat();
        drink.drink();
        System.out.println("評委3:難吃到家了...");
    }
}


class SimpleFactory {
    public  Factory getFactory( ) {
        Factory f = null;
        try {
            InputStream in = SimpleFactory.class.getResourceAsStream("aa.properties");
            Properties prop = new Properties();
            prop.load(in);
            
            String className = prop.getProperty("factory");
            System.out.println(className + "!!!!");
            f = (Factory) Class.forName(className).newInstance();
            
            prop.clear();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return f;
    }
}

// ========================================================

public class Test {
    public static void main(String[] args) {
        while(true) {
            Business b = new Business();
            b.taste(new SimpleFactory().getFactory());
            
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

aa.properties

factory=com.woniuxy.j_abstractfactory.c.KFCFactory

本文來自部落格園,作者:秋華,轉載請註明原文連結:https://www.cnblogs.com/qiu-hua/p/15227308.html