设计模式 -- Factory Method 模式(工厂方法模式)

设计模式 – Factory Method 模式

将实例生成交给子类
在Facotry Method模式中,父类决定实例的生产方式,但并不决定所要生产的具体的类,具体的处理全部交给子类负责.这样就可以将生产实例的框架(framework)和实际负责生产实例的类解耦.


代码实现

下面的例子的作用是制作身份证(ID卡)

  • 生成实例的框架(framework包)

/**
 * <pre>框架  Creator(创建者)
 *      1.createProduct方法是用于生产实例的方法.
 *      2.不用new关键字来生成实例,而是调用生成实例的专用方法来生成实例,这样就
 *   可以防止父类与其他具体类类耦合.
 * </pre>
 */
public abstract class Factory {


    public final Product create(String owner) {
        Product p = createProduct(owner);
        registerProduct(p);
        return  p;
    }

    protected abstract Product createProduct(String owner);

    protected abstract void registerProduct(Product product);
}


----------

/**
 * <pre> 框架 产品 </pre>
 */
public abstract class Product {
    public abstract void use();
}


  • 加工处理(idcard包)
/**
 * <pre> ConcreteCreator(具体的创建者)</pre>
 */
public class IDCardFactory extends Factory {
    private List<String> 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<String> getOwners() {
        return owners;
    }
}


----------

import xin.gonefuture.facotryMethod.farmework.Product;

/**
 * <pre> ConcreteProduct(具体的产品)</pre>
 */
public class IDCard extends Product {
    private String owner;
    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;
    }

}

制作和使用IDCard

/**
 * <pre>使用framework包和idcard包来制作和使用IDCard</pre>
 */

public class Main {
    public static void main(String[] args) {
        Factory factory = new IDCardFactory();
        Product card1 = factory.create("小明");
        Product card2 = factory.create("小红");
        Product card3 = factory.create("小刚");
        card1.use();
        card2.use();
        card3.use();
    }
}

要点

1.框架与具体加工

framework包不依赖于idcard包.

2.生成实例 — 方法的三种实现方法

  • 指定为抽象方法.
abstract class Factory {
    // 子类必须实现该方法
    public abstract Product createProduct(String name);
    ...
}
  • 为其实现默认处理
abstract class Factory {
    // 此时因为使用了new关键字,所以不能将Product定义为抽象类.
    public Product createProduct(String name) {
        return new Product(name);
    }
    ...
}
  • 在其中抛出异常
abstract class Factory {
    // 如果不在子类覆盖此方法就会报异常.不过需要编写异常类.
    public Product createProduct(String name) {
        throw new FactoryMethodRuntiemExaception();
    }
    ...
}

猜你喜欢

转载自blog.csdn.net/weixin_35040169/article/details/80184075