工厂模式的特点是将子类的初始化交给子类工厂去做,缺点是容易造成子类工厂的泛滥,需要什么样的子类就要创建对应的子类工厂。
具体的代码示例如下:
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();
}
}
代码示例来源于《图解设计模式》