Java设计模式之工厂模式

1. 简单工厂模式

通过一个工厂类来创建对象,而无需直接调用对象的构造函数。

将对象的创建过程封装在工厂类中,客户端只需要通过工厂类来获取所需的对象。

1.1 UML类图

1.2 代码实现

手机产品类

interface Phone{
}

class MPhone implements Phone{
    public MPhone(){
        System.out.println("制造小米手机");
    }
}

class IPhone implements Phone{
    public IPhone(){
        System.out.println("制造苹果手机");
    }
}

工厂类

class PhoneFactory{
    public Phone createPhone(String phoneType){
        if ("小米手机".equals(phoneType)){
            return new MPhone();
        }else if ("苹果手机".equals(phoneType)){
            return new IPhone();
        }else {
            return null;
        }
    }
}

客户端

public class Client {
    public static void main(String[] args) {
        String phoneType1 = "小米手机";  //1客户的需求,他想要小米手机
        String phoneType2 = "苹果手机";  //2客户的需求,他想要苹果手机

        PhoneFactory phoneFactory = new PhoneFactory();//创建生产工厂对象,此时该工厂可以生产两种类型的手机(本质上可以生产很多类型的手机)

        //通过工厂进行生产,不让用户介入
        phoneFactory.createPhone(phoneType1);
        phoneFactory.createPhone(phoneType2);
    }
}

所有代码

//客户端
public class Client {
    public static void main(String[] args) {
        String phoneType1 = "小米手机";  //1客户的需求,他想要小米手机
        String phoneType2 = "苹果手机";  //2客户的需求,他想要苹果手机

        PhoneFactory phoneFactory = new PhoneFactory();//创建生产工厂对象,此时该工厂可以生产两种类型的手机(本质上可以生产很多类型的手机)

        //通过工厂进行生产,不让用户介入
        phoneFactory.createPhone(phoneType1);
        phoneFactory.createPhone(phoneType2);
    }
}

//手机产品
interface Phone{
}

class MPhone implements Phone{
    public MPhone(){
        System.out.println("制造小米手机");
    }
}

class IPhone implements Phone{
    public IPhone(){
        System.out.println("制造苹果手机");
    }
}

//手机工厂
class PhoneFactory{
    public Phone createPhone(String phoneType){
        if ("小米手机".equals(phoneType)){
            return new MPhone();
        }else if ("苹果手机".equals(phoneType)){
            return new IPhone();
        }else {
            return null;
        }
    }
}

 

1.3 理解

        简单工厂模式下,工厂只能创建实现了 Phone 接口的类的对象,进行扩展功能的时候需要添加新的实现类,并且需要修改工厂的代码(即createPhone() 方法),违反了设计模式的开闭原则(OCP)

2. 工厂方法模式

工厂方法模式将工厂抽象化,并定义一个创建对象的接口。每增加新产品,只需增加该产品以及对应的具体实现工厂类,由具体工厂类决定要实例化的产品是哪个,将对象的创建与实例化延迟到子类,这样工厂的设计就符合“开闭原则”了,扩展时不必去修改原来的代码。在使用时,用于只需知道产品对应的具体工厂,关注具体的创建过程,甚至不需要知道具体产品类的类名,当我们选择哪个具体工厂时,就已经决定了实际创建的产品是哪个了(CV)

2.1 UML类图

2.2 代码实现

手机产品类

interface Phone{
}

class MPhone implements Phone{
    public MPhone(){
        System.out.println("制造小米手机");
    }
}

class IPhone implements Phone{
    public IPhone(){
        System.out.println("制造苹果手机");
    }
}

工厂类

interface PhoneFactory{
    Phone createPhone();
}

class MPhoneFactory implements PhoneFactory{
    @Override
    public Phone createPhone() {//此处类型写 MPhone,更能体验单一职责原则
        return new MPhone();
    }
}

class IPhoneFactory implements PhoneFactory{
    @Override
    public Phone createPhone() {//此处类型写 IPhone,更能体验单一职责原则
        return new IPhone();
    }
}

客户端

public class Client {
    public static void main(String[] args) {
        MPhoneFactory mPhoneFactory = new MPhoneFactory();//创造该工厂对象的时候,注定该工厂只能生产 小米手机
        mPhoneFactory.createPhone();//生产小米手机

        IPhoneFactory iPhoneFactory = new IPhoneFactory();//创建该工厂对象的时候,注定该工厂只能生产 苹果手机
        iPhoneFactory.createPhone();//生产苹果手机
    }
}

 所有代码

//客户端
public class Client {
    public static void main(String[] args) {
        MPhoneFactory mPhoneFactory = new MPhoneFactory();//创造该工厂对象的时候,注定该工厂只能生产 小米手机
        mPhoneFactory.createPhone();//生产小米手机

        IPhoneFactory iPhoneFactory = new IPhoneFactory();//创建该工厂对象的时候,注定该工厂只能生产 苹果手机
        iPhoneFactory.createPhone();//生产苹果手机
    }
}

//手机产品类
interface Phone{
}

class MPhone implements Phone{
    public MPhone(){
        System.out.println("制造小米手机");
    }
}

class IPhone implements Phone{
    public IPhone(){
        System.out.println("制造苹果手机");
    }
}

//工厂类
interface PhoneFactory{
    Phone createPhone();
}

class MPhoneFactory implements PhoneFactory{
    @Override
    public Phone createPhone() {//此处类型写 MPhone,更能体验单一职责原则
        return new MPhone();
    }
}

class IPhoneFactory implements PhoneFactory{
    @Override
    public Phone createPhone() {//此处类型写 IPhone,更能体验单一职责原则
        return new IPhone();
    }
}

2.3 理解

        工厂方法模式下,是由小工厂(工厂接口的实现类)在工厂运行标准(接口工厂)的约束下完成对手机的生产(创建对象)。在客户端,客户选择某个工厂(创建该工厂对象)的时候,就间接选择了某个手机。

3. 抽象工厂模式

在工厂方法模式中,我们使用一个工厂创建一个产品,一个具体工厂对应一个具体产品,但有时候我们需要一个工厂能够提供一系列产品对象,而不是单一的对象,这个时候我们就需要使用抽象工厂模式。

注:一系列产品,在现实生活中,购买小米手机后,需要原装充电器,原装耳机,配套手表等等一系列物品,这些产品都是由同一个工厂生产出来的。即工厂对应品牌。

一系列产品对象就是该工厂通过不同方法创建出来的对象。

3.1 UML类图

3.2 代码

产品类

interface Phone{
}

class MPhone implements Phone{
    public MPhone(){
        System.out.println("制造小米手机");
    }
}

class IPhone implements Phone{
    public IPhone(){
        System.out.println("制造苹果手机");
    }
}


interface Charger{
}

class MCharger implements Charger{
    public MCharger(){
        System.out.println("制作小米充电器");
    }
}

class ICharger implements Charger{
    public ICharger(){
        System.out.println("制作苹果充电器");
    }
}

工厂类

interface Factory{
    Phone createPhone();
    
    Charger createCharger();
}

//该工厂就代表 小米品牌
class MFactory implements Factory{
    @Override
    public Phone createPhone() {//此处类型写 MPhone,更能体验单一职责原则
        return new MPhone();
    }

    @Override
    public Charger createCharger() {//此处类型写 MCharger,更能体验单一职责原则
        return new MCharger();
    }
}

//该工厂就代表 苹果品牌
class IFactory implements Factory{
    @Override
    public Phone createPhone() {//此处类型写 IPhone,更能体验单一职责原则
        return new IPhone();
    }

    @Override
    public Charger createCharger() {//此处类型写 ICharger,更能体验单一职责原则
        return new ICharger();
    }
}

 客户端

public class Client {
    public static void main(String[] args) {
        MFactory mPhoneFactory = new MFactory();//创造该工厂对象的时候,注定该工厂只能生产 小米品牌商品
        mPhoneFactory.createPhone();//生产小米手机
        mPhoneFactory.createCharger();//生产小米充电器

        IFactory iPhoneFactory = new IFactory();//创建该工厂对象的时候,注定该工厂只能生产 苹果品牌商品
        iPhoneFactory.createPhone();//生产苹果手机
        iPhoneFactory.createCharger();//生产苹果充电器
    }
}

所有代码

//客户端
public class Client {
    public static void main(String[] args) {
        MFactory mPhoneFactory = new MFactory();//创造该工厂对象的时候,注定该工厂只能生产 小米品牌商品
        mPhoneFactory.createPhone();//生产小米手机
        mPhoneFactory.createCharger();//生产小米充电器

        IFactory iPhoneFactory = new IFactory();//创建该工厂对象的时候,注定该工厂只能生产 苹果品牌商品
        iPhoneFactory.createPhone();//生产苹果手机
        iPhoneFactory.createCharger();//生产苹果充电器
    }
}

//手机产品类
interface Phone{
}

class MPhone implements Phone{
    public MPhone(){
        System.out.println("制造小米手机");
    }
}

class IPhone implements Phone{
    public IPhone(){
        System.out.println("制造苹果手机");
    }
}

//充电器产品类
interface Charger{
}

class MCharger implements Charger{
    public MCharger(){
        System.out.println("制作小米充电器");
    }
}

class ICharger implements Charger{
    public ICharger(){
        System.out.println("制作苹果充电器");
    }
}

//工厂
interface Factory{
    Phone createPhone();

    Charger createCharger();
}

//该工厂就代表 小米品牌
class MFactory implements Factory{
    @Override
    public Phone createPhone() {//此处类型写 MPhone,更能体验单一职责原则
        return new MPhone();
    }

    @Override
    public Charger createCharger() {//此处类型写 MCharger,更能体验单一职责原则
        return new MCharger();
    }
}

//该工厂就代表 苹果品牌
class IFactory implements Factory{
    @Override
    public Phone createPhone() {//此处类型写 IPhone,更能体验单一职责原则
        return new IPhone();
    }

    @Override
    public Charger createCharger() {//此处类型写 ICharger,更能体验单一职责原则
        return new ICharger();
    }
}

3.3 理解

        抽象工厂模式下,所有品牌工厂(工厂实现类)在工厂标准的约束(接口)下,生产该品牌下的一系列产品(通过工厂方法创建对象)。

4. 总结

对比工厂方法和抽象工厂,它两个本质差不多,区别在于工厂能创建的不同产品个数。​​​​​​​工厂方法只能生产一种商品,而抽象工厂则是对其进行扩展,能够生产不同种类的产品。

在现实生活中抽象工厂模式下的子工厂就相当于 品牌,产品就相当于该品牌下的一系列商品(苹果工厂不会生产小米手机)。

​​​​​​​

以上所有工厂均可结合单例模式使用,或者直接将生产对象的方法使用 static 修饰。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值