设计模式详解(三)——工厂方法模式

工厂方法模式简介

工厂方法模式定义
工厂模式是简单工厂模式的延伸,符合开闭原则的基础上,还可以在增加新的具体产品对象时不需要对已有系统做任何修改。
工厂方法模式又称为工厂模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。

工厂方法的模式结构
(1) 抽象工厂(Factory)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
(2)具体工厂(ConcreteCreator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
(3)抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
(4)具体产品(ConcreteProduct)角色:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。

优点:
1、用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。

缺点:
1、每次增加一个产品时,都需要增加一个具体产品类和具体工厂类,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度
2、抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决

  代码例子:中国pizza工厂制造中国pizza,巴西pizza工厂制造巴西pizza。使用工厂方法模式模拟该场景。
(1)Pizza:充当抽象产品角色

/**
 * @author yyx
 */
public abstract class Pizza {
    public abstract void run();//抽象产品方法
}

(2)ChinaPizza :充当具体的产品角色

/**
 * @author yyx
 */

public class ChinaPizza extends Pizza {
    @Override
    public void run() {
        System.out.println("中国pizza");
    }
}

(3)BrazilPizza:充当具体的产品角色

/**
 * @author yyx
 */

public class BrazilPizza extends Pizza{
    @Override
    public void run() {
        System.out.println("巴西Pizza");
    }
}

(4)PizzaFactory:充当抽象工厂角色

/**
 * @author yyx
 */

public abstract class PizzaFactory {
    public void run(){
        Pizza car = this.producePizza();//在工厂类中直接调用汽车工厂类得业务方法run()
        car.run();
    }
    public abstract Pizza producePizza();//抽象工厂方法.
}

(5)ChinaPizzaFactory:充当具体工厂角色

/**
 * @author yyx
 */

public class ChinaPizzaFactory extends PizzaFactory{
    @Override
    public Pizza producePizza() {
        Pizza pizza = new ChinaPizza(); //创建中国pizza的对象
        return pizza;
    }
}

(6)BrazilPizzaFactory:充当具体工厂角色

/**
 * @author yyx
 */

public class BrazilPizzaFactory extends PizzaFactory{
    @Override
    public Pizza producePizza() {
        Pizza pizza = new BrazilPizza(); //创建巴西pizza的对象
        return pizza;
    }
}

(7)客户端测试类。

/**
 * @author yyx
 */
public class Client {
    public static void main(String[] args) {
        PizzaFactory factory, factory1;
        Pizza pizza,pizza1;
        factory = new ChinaPizzaFactory();
        factory1 = new BrazilPizzaFactory();
        pizza = factory.producePizza();
        pizza1 = factory1.producePizza();
        pizza.run();
        pizza1.run();
    }
}

运行结果如下所示:

中国pizza
巴西Pizza

工厂方法的适用环境
(1)一个类不知道它所需要的对象的类:在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体的产品对象由具体工厂类创建;客户端需要知道创建具体产品的工厂类。
(2)一个类通过其子类来指定创建哪个对象:在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,从而使得系统更容易扩展。

工厂方法的总结
  工厂方法模式是简单工厂模式的进一步抽象和推广。工厂方法模式不但保持了简单工厂模式的优点,而且克服了它的缺点。在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。


以上代码下载请点击该链接:https://github.com/Yarrow052/Java-package.git

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值