【java学习笔记】设计模式4——Factory Method(工厂方法)模式

 该文章是阅读《图解设计模式》的学习笔记。书本链接https://www.ituring.com.cn/book/1811

    在前面的Template Method模式中,实在父类中定义模板方法规定处理的流程,在子类中实现具体的处理。如果将该模式用于生成实例,就演变成了Factory Method模式,首先来看该模式的结构图:

Product抽象类代码:

package com.wen.FactoryMethod.framework;

public abstract class Product {
    public abstract void use();
}

 Factory抽象类代码: 

package com.wen.FactoryMethod.framework;

public abstract class Factory {
    protected abstract Product createProduct(String owner,String color,String penName);
    protected abstract void registerProduct(Product product);

    public final Product create(String owner,String color,String penName){
        Product product = createProduct(owner,color,penName);
        registerProduct(product);
        return product;
    }

}

Pen类代码:

package com.wen.FactoryMethod.pen;

import com.wen.FactoryMethod.framework.Product;

public class Pen extends Product {
    private String owner;
    private String color;
    private String penName;


    public String getOwner() {
        return owner;
    }

    public String getColor() {
        return color;
    }

    public String getPenName() {
        return penName;
    }

    public Pen(String owner, String color, String penName) {
        this.owner = owner;
        this.color = color;
        this.penName = penName;
        System.out.println("制作"+owner+color+"色的"+penName);
    }

    @Override
    public void use() {
        System.out.println("使用"+owner+color+"色的"+penName);
    }
}

PenFactory类代码:

package com.wen.FactoryMethod.pen;

import com.wen.FactoryMethod.framework.Factory;
import com.wen.FactoryMethod.framework.Product;

import java.util.ArrayList;
import java.util.List;

public class PenFactory extends Factory {
    List<String> ownerList = new ArrayList();

    @Override
    protected Product createProduct(String owner,String color,String penName) {
        return new Pen(owner,color,penName);
    }

    @Override
    protected void registerProduct(Product product) {
        ownerList.add(((Pen)product).getOwner());
    }

    public List<String> getOwnerList() {
        return ownerList;
    }
}

Main入口类代码:

package com.wen.FactoryMethod;

import com.wen.FactoryMethod.framework.Factory;
import com.wen.FactoryMethod.framework.Product;
import com.wen.FactoryMethod.pen.PenFactory;

public class Main {
    public static void main(String[] args) {
        Factory factory = new PenFactory();
        Product pen1 = factory.create("小明","红","钢笔");
        Product pen2 = factory.create("小红","黑","钢笔");
        Product pen3 = factory.create("小白","蓝","中性笔");
        pen1.use();
        pen2.use();
        pen3.use();

    }
}

运行结果:

 在上面的代码中我们值得注意的是,在framework框架包中并没有引入pen包的类,因此使用已有框架生成新类时,不用对framework包里面的代码进行修改。即framework不依赖于pen包。

 分析该模式中所包含的角色:

Product(产品):属于框架包里面的抽象类,定义了该模式中生成的实例所持有的接口,具体实现由ConcreteProduct具体的产品类角色决定。

Creator(创建者):属于框架包里面的抽象类,负责生产Product角色的抽象类,该类使用createProduct方法生产实例,而不是直接用new关键字生产,可以防止父类与其它具体类耦合。

ConcreteProduct(具体的产品):属于具体加工包里面内容,如上面代码中的Pen类。

ConcreteCreator(具体的创建者):属于具体加工包里面的内容。负责生成具体的产品。如上面代码中的PenFactory类。

发布了54 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/baidu_35800355/article/details/105323929
今日推荐