1. 程式人生 > >設計模式系列之---工廠模式

設計模式系列之---工廠模式

工廠模式的特點是將子類的初始化交給子類工廠去做,缺點是容易造成子類工廠的泛濫,需要什麼樣的子類就要建立對應的子類工廠。

具體的程式碼示例如下:

package pattern.factoryPattern.framework;

/**
 * Created by think on 2018/10/28.
 * 工廠模式的特點是將例項的生成交給子類
 */
public  abstract  class Factory {

    protected abstract Product createProduct(String owner);    //建立產品,是一個抽象方法,建立具體的產品由子類決定

    protected  abstract void  registerProduct(Product product);   //註冊產品

    public  final Product create(String owner){   //這個也叫模板方法,定義方法的執行順序
        Product p = createProduct(owner);   //因為父類中定義的抽象方法,具體的實現交給各個具體的子類工廠
        registerProduct(p);
        return p;
    }
}

--------------------------------------------------------

package pattern.factoryPattern.framework;

/**
 * Created by think on 2018/10/28
 * 抽象的產品,它是的子類就是要初始化的物件.
 */
public abstract  class Product {
    public  abstract void  use(); //定義了任意可以use的東西
}

------------------------------------------------------------------------------

package pattern.factoryPattern;

import pattern.factoryPattern.framework.Product;

/**
 * Created by think on 2018/10/28.
 */
public class IDCard  extends Product {
    private  String owner;
    public  IDCard(String owner){
        System.out.println("製作"+owner+"的Id卡");
        this.owner=owner;
    }
    @Override
    public void use() {
        System.out.println("使用"+owner+"的Id卡");
    }

    public  String  getOwner(){
        return  owner;
    }
}

--------------------------------------------------------------------

package pattern.factoryPattern;

import pattern.factoryPattern.framework.Factory;
import pattern.factoryPattern.framework.Product;

/**
 * Created by think on 2018/10/29.
 * 具體的子類,
 * 工廠模式有一個缺點,容易造成子類工廠的泛濫,需要什麼樣的子類就需要新建一個具體的子類工廠類
 */
public class IDCardFactory extends Factory {
   // private List owners = new ArrayList();
    @Override
    protected Product createProduct(String owner) {  //在具體的子類中決定例項化具體的產品
        return new IDCard(owner);
    }

    @Override
    protected void registerProduct(Product product) {
        // owners.add(((IDCard)product).getOwner());
    }

   // public List  getOwners(){
      //  return owners;
  //  }
}

---------------------------------------------------------------

package pattern.factoryPattern;

import pattern.factoryPattern.framework.Factory;
import pattern.factoryPattern.framework.Product;

/**
 * Created by think on 2018/10/29.
 */
public class TestMain {
    public  static  void  main(String[] args){
        Factory f = new IDCardFactory();
        Product p = f.create("小明");    //這裡走的是父類的Factory中的create方法,但是方法中的createProduct(),
                                        //registerProduct()走的是子類中的方法
        Product p1 = f.create("小剛");
        p.use();
        p1.use();

    }
}

程式碼示例來源於《圖解設計模式》