gof設計模式之原廠模式大致分為3中方式:
A 簡單原廠模式
B Factory 方法模式
C 抽象原廠模式
A 簡單原廠模式:整個模式以工廠類為核心,由工廠類實現指定類型的對象的建立.
方便之處見圖:
代碼實現:
//水果
interface Friut{
public Friut get();
}
//蘋果
class Apple implements Friut{
public Friut get(){
return new Apple();
}
}
//橘子
class Orange implements Friut{
public Friut get(){
return new Orange();
}
}
//香蕉
class Banana implements Friut{
public Friut get(){
return new Banana();
}
}
//水果廠
class FriutFactory{
public static Friut make(Friut friut){
return friut.get();
}
}
//水果店
class FriutShop{
public static Friut take(String name){
if("apple".equals(name)){
return FriutFactory.make(new Apple());
}else if("orange".equals(name)){
return FriutFactory.make(new Orange());
}else if("banana".equals(name)){
return FriutFactory.make(new Banana());
}else{
System.out.println("暫時沒該水果供售");
return null;
}
}
public static void main(String[] args){
System.out.println("進入商店買水果:");
take("apple");
take("banana");
take("orange");
}
}
B Factory 方法模式
從上面的簡單工廠可以看出,如果只是簡單的幾種類別需要產出,那還是很方便的,要是水果店要賣個1000中水果,那工廠裡面可是一大堆的邏輯判斷了..由此引出Factory 方法模式
Factory 方法模式:核心工廠類不再負責對象的建立,將建立具體的對象延遲到具體的工廠類中,核心工廠類只負責子工廠類必須實現的介面,而屏蔽建立的細節.
這樣就是水果點業務擴大,品種齊全了,實行專一生產.看著比簡單工廠就是正規點
代碼實現:
interface Friut{
public Friut get();
}
class Apple implements Friut{
public Friut get(){
return new Apple();
}
}
class Orange implements Friut{
public Friut get(){
return new Orange();
}
}
class Banana implements Friut{
public Friut get(){
return new Banana();
}
}
interface FriutFactory{
public Friut makeFriut();
}
class AppleFactory implements FriutFactory{
@Override
public Friut makeFriut() {
return new Apple();
}
}
class OrangeFactory implements FriutFactory{
@Override
public Friut makeFriut(){
return new Orange();
}
}
class BananaFactory implements FriutFactory{
@Override
public Friut makeFriut() {
return new Banana();
}
}
class FriutShop{
public static Friut take(FriutFactory factory){
return factory.makeFriut();
}
public static void main(String[] args){
System.out.println("進入商店買水果:");
take(new AppleFactory());
take(new BananaFactory());
take(new OrangeFactory());
}
}
C 抽象Factory 方法
Factory 方法已經很專一了,為什麼還要抽象工廠呢?
原來水果店規模以後,已經不單單只賣某一種水果了,現在要產品成套銷售(蘋果+香蕉=》天天美容裝)
從現在看,每個工廠都生產不同種類的產品(這裡可能區分不是很明顯,只是用蘋果和蘋果汁帶表示,you can understand ?)
這是Factory 方法和抽象工廠的差別,從單一對象的建立擴充了.
代碼實現:
interface Friut{
public Friut get();
}
interface Drink{
public Drink get();
}
class AppleCider implements Drink{
@Override
public Drink get() {
return new AppleCider();
}
}
class Apple implements Friut{
public Friut get(){
return new Apple();
}
}
class Orange implements Friut{
public Friut get(){
return new Orange();
}
}
class OrangeCider implements Drink{
@Override
public Drink get() {
return new OrangeCider();
}
}
class BananaCider implements Drink{
@Override
public Drink get() {
return new BananaCider();
}
}
class Banana implements Friut{
public Friut get(){
return new Banana();
}
}
interface ShopFactory{
public Friut makeFriut();
public Drink makeDrink();
}
class AppleFactory implements ShopFactory{
@Override
public Friut makeFriut() {
return new Apple();
}
@Override
public Drink makeDrink() {
return new AppleCider();
}
}
class OrangeFactory implements ShopFactory{
@Override
public Friut makeFriut(){
return new Orange();
}
@Override
public Drink makeDrink() {
return new OrangeCider();
}
}
class BananaFactory implements ShopFactory{
@Override
public Friut makeFriut() {
return new Banana();
}
@Override
public Drink makeDrink() {
return new BananaCider();
}
}
class FriutShop{
public static String take(ShopFactory factory){
System.out.println("要是有個有個名字該多好啊.一定記住是一族產品");
return factory.makeFriut().toString() + factory.makeDrink().toString();
}
public static void main(String[] args){
System.out.println("進入商店買水果:");
take(new AppleFactory());
take(new BananaFactory());
take(new OrangeFactory());
}
}
就假設果汁和對應的水果做組合套吧..
這是我的一些理解..要是有問題的話請you 指出啊.