1. 程式人生 > >簡單工廠、工廠模式和抽象工廠

簡單工廠、工廠模式和抽象工廠

  工廠可以分為三種:簡單工廠、工廠模式和抽象工廠,三者的關係是遞進的,以做包子為例,剛開始只有兩種包子:豆腐包和牛肉包,可以使用簡單工廠(或者叫靜態工廠)來解決,隨著包子種類的越來越多,發現沒新增一種包子,就需要改工廠類,擴充套件性太差,因此出現了工廠模式,提取一個公共的做包子介面,然後針對每一種包子建一個工廠類來專門生產這種包子,隨後店面擴大,開始賣豆漿了,豆漿是不能在包子工廠裡生產的,因此這時候就需要提取一個公共的既可以做包子又可以做豆漿的介面,然後每一個工廠去實現這個介面,這樣每個工廠就都可以既生產包子又生產豆漿,只是種類不同,這就是抽象工廠。工廠方法和抽象工廠的最大區別在於工廠模式是用來建立同一個產品的不同型別的,但是抽象工廠模式是用來建立不同類的產品。

  下面給出三種模式的類圖和簡單程式碼

  1、簡單工廠

  類圖

  結構非常簡單,定義一個包子介面,兩個具體實現類,再有一個工廠負責根據名字生產不同的包子。可以看出,簡單工廠擴充套件性非常差,例如我們要生產青菜包,則需要去修改工程類,違背了開閉原則。程式碼如下

package simpleFactory;
public interface BaoZi {
    void method();
}
package simpleFactory;
public class DouFuBao implements BaoZi {
    @Override
    
public void method() { System.out.println("豆腐包"); } }
package simpleFactory;
public class NiuRouBao  implements BaoZi {
    @Override
    public void method() {
        System.out.println("牛肉包");
    }
}
package simpleFactory;
import java.util.Objects;
public class SimpleFactory {
    
public BaoZi create(String name) { if(Objects.equals("DouFuBao", name)) { return new DouFuBao(); } if(Objects.equals("NiuRouBao", name)) { return new NiuRouBao(); } return null; } } 

  2、工廠模式

  類圖

  工廠模式中,我們提取了一個抽象的工廠介面,這個介面中有一個方法那就是生產包子,然後對每一種包子我們都有對應的工廠類去專門負責建立,這樣子當我們需要再新增一種包子的時候,只需新增包子類和對應的工程類,不需對原有程式碼進行修改。程式碼如下

package Factory;
public interface BaoZi {
    void method();
}
package Factory;
public class DouFuBao implements BaoZi {
    @Override
    public void method() {
        System.out.println("豆腐包");
    }
}
package Factory;
public class NiuRouBao  implements BaoZi {
    @Override
    public void method() {
        System.out.println("牛肉包");
    }
}
package Factory;
public class DouFuBaoFactroy implements IFactory{
    @Override
    public BaoZi create() {
        return new DouFuBao();
    }
}
package Factory;
public class NiuRouBaoFactroy implements IFactory{
    @Override
    public BaoZi create() {
        return new NiuRouBao();
    }
}
package Factory;
public interface IFactory {
    BaoZi create();
}

  3、抽象工廠

  類圖

  可以看到,在抽象工廠中我們定一個一個工廠介面,它含有兩個方法,分別可以生產包子和豆漿,然後有具體的工廠類去實現它完成實體的建立,具體實體類不再貼出,程式碼如下

package AbstractFactory;
public interface IFactory {
    BaoZi createBaoZi();
    DouJiang createDouJiang();
}
package AbstractFactory;
public interface BaoZi {
    void method();
}
package AbstractFactory;
public interface DouJiang {
    void method();
}
package AbstractFactory;
public class Factroy1 implements IFactory{
    @Override
    public BaoZi createBaoZi() {
        return new DouFuBao();
    }
    @Override
    public DouJiang createDouJiang() {
        return new LvDouJiang();
    }
}
package AbstractFactory;
public class Factroy2 implements IFactory{
    @Override
    public BaoZi createBaoZi() {
        return new NiuRouBao();
    }
    @Override
    public DouJiang createDouJiang() {
        return new HuangDouJiang();
    }
}