Java设计模式--工厂模式

1 Factory Pattern 工厂模式

目的:将实例的生成交给子类;
实现:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

1.首先将需要创建的各种不同对象的相关代码封装到不同的类中,这些类称为具体产品类,而将它们公共的代码进行抽象和提取后封装在一个抽象产品类中, 每一个具体产品类都是抽象产品类的子类;
2.然后提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品的工厂方法,该方法可以根据所传入的参数不同创建不同的具体产品对象;
3.客户端只需调用工厂类的工厂方法并传入相应的参数即可得到一个产品对象。

2 实现

代码场景:现在一部手机,是从富士康代工厂生产出来的,你到手之后直接使用就行了,而不用去操心富士康是怎么生产出来的,以及手机厂商是怎么设计、打磨的。

2.1 代码实现

手机抽象类(接口或抽象类都可以)

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

手机实现类:小米手机

public class XiaoMi extends MobilePhone {
    public XiaoMi() {
      System.out.println("小米手机研发中--经过2年研发 70道工序打造而成。");
    }
    @Override
    public void use() {
      System.out.println("-- 雷布斯欢迎你使用小米手机 -- ");
    }
}
}

手机实现类:锤子手机

public class ChuiZi extends MobilePhone {
    public ChuiZi() {
        System.out.println("锤子手机研发中--千呼万唤始出来,犹抱琵琶半遮面。");
    }

    @Override
    public void use() {
        System.out.println("-- 锤子手机拯救世界 -- ");
    }
}

手机实现类:华为手机

public class HuaWei extends MobilePhone {
    public HuaWei() {
        System.out.println("华为手机研发中--老子是世界500强。 ");
    }

    @Override
    public void use() {
        System.out.println("-- 华为--不仅仅是世界500强 -- ");
    }
}

工厂类:富士康工厂

public class FoxconnFactory {
    public MobilePhone getProduct(String brand) {
        if ("小米".equals(brand)) {
            return new XiaoMi();
        } else if ("锤子".equals(brand)) {
            return new ChuiZi();
        } else {
            return new HuaWei();
        }
    }
}

工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。

2.2 涉及角色

在简单工厂模式结构图中包含如下几个角色:
Factory(工厂角色):工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有产品实例的内部逻辑;工厂类可以被外界直接调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法 factoryMethod(),它的返回类型为抽象产品类型 Product。

Product(抽象产品角色):它是工厂类所创建的所有对象的父类,封装了各种产品对象的公有方法,它的引入将提高系统的灵活性,使得在工厂类中只需定义一个通用的工厂方法,因为所有创建的具体产品对象都是其子类对象。

ConcreteProduct(具体产品角色):它是简单工厂模式的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现在抽象产品中声明的抽象方法。

缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

2.3 调用

public class Client {

    public static void main(String[] args) {
        FoxconnFactory factory = new FoxconnFactory();
        MobilePhone xiaomi = factory.getProduct("小米");
        MobilePhone chuizi = factory.getProduct("锤子");
        MobilePhone huawei = factory.getProduct("华为");
        xiaomi.use();
        chuizi.use();
        huawei.use();
    }
}

结果:

小米手机研发中--经过2年研发 70道工序打造而成。
锤子手机研发中--千呼万唤始出来,犹抱琵琶半遮面。
华为手机研发中--老子是世界500强。 
-- 雷布斯欢迎你使用小米手机 -- 
-- 锤子手机拯救世界 -- 
-- 华为--不仅仅是世界500强 -- 

Java设计模式汇总:点击跳转
代码地址:点击跳转

参考文献:
[ 1 ] 图解设计模式/(日)结城浩著;杨文轩译。–北京:人民邮电出版社,2017.1.
[ 2 ] 维基百科 设计模式
[ 3 ] 极客学院WIKI–设计模式.
[ 4 ] 菜鸟教程–设计模式.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值