设计模式——工厂方法模式


@Author;云都小生


回顾简单工厂模式



第一节我更新了简单工厂模式,特点就是实现了对象创建与客户端的分离,在创建对象的时候,我们只需要传入参数,就能获取到相应的对象。但是,简单工厂模式也有局限,它只能用于 创建的对象比较少的情况

现在有这么一种情况,如果我想增加一个产品,那是不是就得修改工厂类里面的代码,我得在里面多加一个判断,如果符合这个参数,就生成相应的对象。

Product product1;
Product product2;
product1 = Factory.getProduct("one");
product2 = Factory.getProduct("tow");d

这样我们传入不同的参数,就获取到了不同的对象,这得益于我们把对象创建都放在了这个Factory工厂类中。但这也有局限,一旦我们想要添加产品,就必须“修改”Factory的static方法(new Object),那有没有什么办法来解决呢?有,我们升级一下,用工厂方法模式。

工厂方法模式:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。与简单工厂模式相同,工厂方法模式也把一个类的实例化延迟到其子类。


工厂方法模式概述



其实一张图胜千言。
这里写图片描述


代码实现


//抽象工厂
abstract class Factory 
{
    abstract Product factoryMethod();
}

//抽象产品
abstract class Product
{
    public abstract void printProduct();
}

//工厂One(用于生产产品One)
public class OneFactory extends Factory
{
    Product factoryMethod()
    {
        return new OneProduct();
    }   
}

//工厂Two(用于生产产品Two)
public class TneFactory extends Factory
{
    Product factoryMethod()
    {
        return new TwoProduct();
    }   
}

//产品One
public class OneProduct extends Product
{
    public void printProduct() {
        System.out.println("这个是产品One");
    }
}

//产品Two
public class TwoProduct extends Product
{
    public void printProduct() {
        System.out.println("这个是产品Two");
    }
}

//main
Factory factory = new OneFactory();
Product product = factory.factoryMethod();
product.printProduct();


问题进阶



我们之前学简单工厂模式的时候,是传入参数,根据参数动态的去选择创建的对象。产品子类越来越多我们就难以去记住各个子类的名字,那我们上面这个例子又碰到了相同的问题。

在main方法里面,我们总是得去new 子类(); 那有没有什么办法解决呢?有的,我们可以先写一个配置文档,在这个文档里面存放所要生成的子类名。然后去获取这个配置文档里面的数据,动态的生成不同的对象。


工厂方法模式的优缺点



对比之前的简单工厂方法,我们有了哪些优点?

优点

  1. 在增加一个新产品的时候,我们不需要修改工厂类,我们只需要增加一个工厂类、产品类,不需要修改工厂接口和产品接口;
  2. 多态设计使我们的工厂可以自主确定创建的产品对象;
  3. 用户无需关心创建的细节。

缺点

  1. 我们不断的添加产品,就需要不断的增加产品类和工厂类,这样我们就会增加复杂度;
  2. 工厂方法模式想要按照传入的参数去动态的创建对象,就需要引用一些工具类来进行处理,增加了系统的实现难度。

2017/9/24 21:01:13 @Author:Cloudking(云都小生)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值