简单工厂模式

从设计模式的类型上来说,简单工厂模式属于创建型模式,又叫静态工厂方法模式,但不属于GoF的23种设计模式之一。

简单工厂模式是由一个工厂对象决定创建哪一种产品类的实例,被创建的实例通常都具有共同的父类。实质即是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类的实例。(这些产品类继承自同一个父类或接口)

简单工厂模式包括如下三种角色(附完整示例代码):
假设一个淡水鱼养殖场可以生产出3种类型的淡水鱼:草鱼、鲶鱼、鲤鱼,只需要告知淡水鱼的类型,若鱼类型存在,则能够生产。这里养殖场就是简单工厂,草鱼、鲶鱼、鲤鱼都是具体产品。
1.简单工厂
简单工厂角色就是简单工厂模式的核心,它负责实现创建所有实例的内部逻辑,具体构造细节是在一个个if/else分支,或者switch/case分支里面的。工厂类可以被外界直接调用,创建所需的产品对象。

package com.simple_factory;

import com.abstract_product.Freshwaterfish;
import com.concrete_product.Carp;
import com.concrete_product.Catfish;
import com.concrete_product.Grasscarp;

public class Fishfarm {
    public static Freshwaterfish produceFish(String type){
        if ("草鱼".equals(type)){
            return new Grasscarp();
        }else if ("鲶鱼".equals(type)){
            return new Catfish();
        }else if ("".equals(type)){
            return new Carp();
        }else {
            System.out.println("抱歉,本养殖场不生产此鱼");
            return null;
        }
    }
}

2.抽象产品
简单工厂模式所创建的所有对象的父类,它负责描述所有产品实例所共有的公共接口 。

package com.abstract_product;

public interface Freshwaterfish {
    //鱼在生长
    void grop();
    //收获鱼
    void harvest();
}

3.具体产品
具体产品是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

package com.concrete_product;

import com.abstract_product.Freshwaterfish;

public class Carp implements Freshwaterfish {
    @Override
    public void grop() {
        System.out.println("鲤鱼在生长");
    }

    @Override
    public void harvest() {
        System.out.println("收获鲤鱼");
    }
}
package com.concrete_product;

import com.abstract_product.Freshwaterfish;

public class Catfish implements Freshwaterfish {
    @Override
    public void grop() {
        System.out.println("鲶鱼在生长");
    }

    @Override
    public void harvest() {
        System.out.println("收获鲶鱼");
    }
}
package com.concrete_product;

import com.abstract_product.Freshwaterfish;

public class Grasscarp implements Freshwaterfish {

    @Override
    public void grop() {
        System.out.println("草鱼在生长");
    }

    @Override
    public void harvest() {
        System.out.println("收获草鱼");
    }
}

客户测试类:

package com.test;

import com.abstract_product.Freshwaterfish;
import com.simple_factory.Fishfarm;

public class Test {
    public static void main(String[] args) {
        Freshwaterfish myCarp = Fishfarm.produceFish("鲶鱼");
        if (myCarp != null){
            myCarp.grop();
            myCarp.harvest();
        }
    }
}

简单工厂模式优点:

1.工厂类含有必要的判断逻辑,能够决定在什么时候创建哪一个产品类的实例,客户端可免除直接创建产品对象的步骤操作,而仅仅“使用”产品。使得对象的创建与对象的使用分离,有利于对功能的复用和系统的维护。

2.客户端无需知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少用户的记忆量。

3.通过引入配置文件,能够在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

简单工厂模式缺点:

1.由于工厂类中集中了所有产品创建的实现逻辑,一旦它不能够正常工作,则整个系统都会受到影响。

2.系统拓展困难,一旦添加新产品就不得不修改工厂逻辑,这样就会造成工厂逻辑过于复杂。

适用场景

1.工厂类负责创建的对象比较少;

2.客户只知道传入工厂类的参数名,对于如何创建对象的逻辑实现并不关心;

3.由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值