02-创建型模式(下)

本文介绍创建型模式中的工厂方法模式、抽象工厂模式和原型模式。工厂方法模式对简单工厂模式抽象,分离对象创建与使用;抽象工厂模式更抽象,能创建多产品族对象;原型模式在创建对象代价高时,以原型为基础创建新对象,可简化步骤、提升性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建型模式(上)

  • 创建型模式共五种,包括:单例模式、建造者模式、工厂方法模式、抽象工厂模式、原型模式,本文介绍后面3种。
  • 单例模式
  • 建造者模式
  • 工厂方法模式
  • 抽象工厂模式
  • 原型模式

一、工厂方法模式

1.1 定义

  • 工厂方法模式对简单工厂模式进行了抽象。包括一个抽象的工厂类(可以是抽象类或接口)和一个抽象产品类。分别由他们的子类来担任具体的工厂类和具体的产品类。
    每个工厂子类负责一个具体产品子类的创建,当有新的商品需求时,只需要增加工厂和商品的实现类即可。

1.2 优点和使用场景

  • 创建对象和对象的使用分离,负责单一职责原则,利于降低代码耦合度,同时便于维护,提高代码复用性,
  • 需要添加新的工厂和产品类型时候,可以直接扩展新的工厂类和产品类,复合开闭原则
  • 使用场景:适用与对后续有一定扩展的场景,但是注意如果场景比较简单,使用简单工厂模式可能会更好

1.3 实现

  • 工厂接口和产品接口
public interface Factory {

    Phone createPhone();
}

public abstract class Phone {

    public abstract void call();

    public abstract void sendMsg();
}
  • 具体工厂和具体产品
public class HuaWeiFactory implements Factory {
    @Override
    public Phone createPhone() {
        return new HuaWeiPhone();
    }
}

public class VivoFactory implements Factory {
    @Override
    public Phone createPhone() {
        return new VivoPhone();
    }
}

public class HuaWeiPhone extends Phone {
    @Override
    public void call() {
        System.out.println("HuaWei phone call...");
    }

    @Override
    public void sendMsg() {
        System.out.println("HuaWei phone send message...");
    }
}

public class VivoPhone extends Phone {
    @Override
    public void call() {
        System.out.println("Vivo phone call...");
    }

    @Override
    public void sendMsg() {

        System.out.println("Vivo phone send message...");
    }
}
  • 测试
//这里我们通过简单的随机一下,就能生产不同类型的产品
public class FactoryFunctionTest {
    public static void main(String[] args) {
        Factory factory;
        if (new Random().nextBoolean()) {
            factory = new HuaWeiFactory();
        } else {
            factory = new VivoFactory();
        }
        Phone phone = factory.createPhone();
        phone.call();
        phone.sendMsg();
    }
}

二、抽象工厂模式

2.1 定义

  • 抽象工厂模式是基于工厂方法模式的,也更加为抽象、最具一般性的。大体上也是和工厂方法模式一样,具备工厂接口和产品接口以及具体的工厂类和具体的产品类。
    抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。简单来说,像前面工厂方法模式的例子,我们一个工厂只能创建一种产品,比如
    HuaWeiFactory只能创建HuaWeiPhone,VivoFactory只能创建VivoPhone,这里的HuaWeiPhone和VivoPhone称为产品族(不同的家族)。现在有个新的需求,我需要生成音乐
    手机MusicPhone或者商务机BusinessPhone,那么HuaWeiMusicPhone和VivoMusicPhone都属于MusicPhone,但是这两个属于不同的产品族,而HuaWeiPhone和HuaWeiMusicPhone
    属于一个产品树,(一棵树的不同分支)。到这里回头看工厂方法模式适合创建同一个产品树下的产品,但是不能创建不同产品族下的产品,而抽象工厂正是为此二来。

2.2 优点和使用场景

  • 和工厂方法模式类似,不过抽象工厂模式可以支持到更加复杂的场景,能够创建一个产品族的具体产品(不同的产品类型),但是工厂方法模式仅能创建一个产品类型的具体
    产品。

2.3 实现

  • 接着前面的代码,首先是2个产品族
//HuaWei产品族
public abstract class HuaWeiPhone {

    public abstract void call();

    public abstract void sendMsg();
}

public class HuaWeiMusicPhone extends HuaWeiPhone {
    @Override
    public void call() {
        System.out.println("HuaWeiMusic Phone  call...");
    }

    @Override
    public void sendMsg() {
        System.out.println("HuaWeiMusic Phone send message...");
    }
}

public class HuaWeiBusinessPhone extends HuaWeiPhone {
    @Override
    public void call() {
        System.out.println("HuaWei Business  phone call...");
    }

    @Override
    public void sendMsg() {
        System.out.println("HuaWei business phone send message...");
    }
}

//Vivo产品族
public abstract class VivoPhone {

    public abstract void call();

    public abstract void sendMsg();
}

public class VivoMusicPhone extends VivoPhone {
    @Override
    public void call() {
        System.out.println("VivoMusic phone call...");
    }

    @Override
    public void sendMsg() {

        System.out.println("VivoMusic phone send message...");
    }
}

public class VivoBusinessPhone extends VivoPhone {
    @Override
    public void call() {
        System.out.println("Vivo Business Phone call...");
    }

    @Override
    public void sendMsg() {

        System.out.println("Vivo Business Phone send message...");
    }
}
  • 然后是工厂,工厂应该具备生成不同产品族的产品的功能
public interface Factory {

    HuaWeiPhone creatHuaWeiPhone();

    VivoPhone createVivoPhone();
}

public class MusicPhoneFactory implements Factory {

    @Override
    public HuaWeiPhone creatHuaWeiPhone() {
        return new HuaWeiMusicPhone();
    }

    @Override
    public VivoPhone createVivoPhone() {
        return new VivoMusicPhone();
    }
}

public class BusinessPhoneFactory implements Factory {

    @Override
    public HuaWeiPhone creatHuaWeiPhone() {
        return new HuaWeiBusinessPhone();
    }

    @Override
    public VivoPhone createVivoPhone() {
        return new VivoBusinessPhone();
    }
}
  • 测试:
//这里我们通过简单的随机一下,就能在跨产品族下生产不同类型的产品
public class AbstructFactoryTest {
    public static void main(String[] args) {
        Factory factory;
        if (new Random().nextBoolean()) {
              factory = new MusicPhoneFactory();
        } else {
              factory = new BusinessPhoneFactory();
        }

        VivoPhone vivoPhone = factory.createVivoPhone();
        HuaWeiPhone huaWeiPhone = factory.creatHuaWeiPhone();
        vivoPhone.call();
        vivoPhone.sendMsg();
        huaWeiPhone.call();
        huaWeiPhone.sendMsg();
    }
}

三、原型模式

3.1 定义

  • 当创建一个对象代价比较高的时候,我们可以提前创建一个原型,然后以此原型为基础创建新的对象,新的对象和原型对象具有相同的属性和特征。

3.2 优点和使用场景

3.2.1 优点
  • 简化创建对象的步骤和成本。
  • 比new创建对象性能要好,频繁创建大量对象时对性能很有提升
  • 类似于工厂模式,但是更加简单
3.2.1 注意事项
  • 不依赖于构造方法,通过clone方法完成,因此它和单例模式是冲突的
  • 注意深浅拷贝。clone只会拷贝基本数据类型,对于引用类型只是引用传递,也就是浅拷贝,如果要深拷贝需要手动将引用类型另行拷贝。

3.3 实现

  • 使用不多,这里简单小结下,可以阅读参考文献[2]

四、参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值