创建型模式(上)
- 创建型模式共五种,包括:单例模式、建造者模式、工厂方法模式、抽象工厂模式、原型模式,本文介绍后面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 实现
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...");
}
}
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 实现
四、参考