什么是原型模式?
设计模式是编程世界的基石,其中原型模式无疑是一种常用而又高效的创建对象的手段。那么,什么是原型模式呢?又该如何去实现它?
在软件工程中,原型模式是一种创建型设计模式。我们可以这样理解:如果创建一个新的对象成本较高,原型模式允许我们复制一个已存在的对象,而非从新构造,这相当于做了一次克隆操作。这就在一定程度上避开了构造函数的约束,极大地提升了程序的执行效率。
原型模式的实现
GO
下面,我们通过Go语言来演示一下原型模式的具体实现。
我们需要创建一个Animal接口,有一个Clone方法代表创建一个自我复制:
type Animal interface {
Clone() Animal
GetName() string
}
然后我们定义a Dog结构体并实现Animal接口:
type Dog struct {
name string
}
func (d *Dog) Clone() Animal {
return &Dog{name: d.name}
}
func (d *Dog) GetName() string {
return d.name
}
func NewDog(name string) Animal {
return &Dog{name: name}
}
克隆操作只是简单地复制了Dog的name字段。
接下来我们就可以进行克隆操作:
func main (){
original := NewDog("Max")
clone := original.Clone()
fmt.Println(clone.GetName()) // Output: Max
}
您可以看到,我们没有通过构造函数创造新的对象,而是直接通过克隆得到新的对象。
Java
首先,我们需要创建一个抽象的Animal接口,这个接口定义了cloneAnimal方法,表示创建一个自我副本。
public interface Animal extends Cloneable {
Animal cloneAnimal();
String getName();
}
然后,我们创建一个Dog类,实现了Animal接口。
public class Dog implements Animal {
private String name;
public Dog(String name) {
this.name = name;
}
@Override
public Animal cloneAnimal() {
return new Dog(name);
}
@Override
public String getName() {
return name;
}
}
在Dog类的cloneAnimal方法中,我们通过new Dog(name)
复制了一个Dog对象。
下面我们就可以进行克隆操作了:
public class TestPrototype {
public static void main(String[] args) {
Dog original = new Dog("Max");
Dog clone = (Dog) original.cloneAnimal();
System.out.println(clone.getName()); // Output: Max
}
}
你可以看到,使用原型模式,我们可以非常简单地创建一个新对象,而无需显式地使用构造函数。这样可以提高程序的性能,特别是在大量创建对象时。
优缺点
原型模式的优点主要体现在,它可以减少系统中类的数量,当一个类的实例之间的状态没有变化时,可以使用原型模式进行复制和拷贝,无需再创建对象,节省了系统资源。
而它的缺点则在复制复杂对象时显现得比较明显,对象之间存在深层次的引用关系,简单复制可能会导致一系列问题,增加了开发的复杂度。
与其他设计模式的比较
原型模式和工厂模式?
原型模式和工厂模式都属于创建型设计模式,但它们的关注点并不同。原型模式注重复制已有的实例,减少新对象的创建工作。工厂模式则是注重通过共通的接口创建新实例,去实现对象的创建和使用的解耦合。
原型和单例模式?
原型模式和单例模式可以有些对立。单例模式强调系统内只能有一个实例,而原型模式则是鼓励对象的复制。
原型模式和克隆模式有什么区别和联系?
原型模式和克隆模式其实在很多情况下是一回事,他们都是基于已存在对象生成新的对象。原型模式是一种创建型设计模式,它指的是通过复制一个已存在的实例来返回新的实例,而这个复制的过程,就是我们通常所说的克隆。所以,克隆的概念通常是作为实现原型模式的一种手段。
当我们讨论“克隆”时,通常会分为“浅克隆”和“深克隆”两种:
- 浅克隆:创建一个新的对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制;如果字段是引用类型,则复制引用但不复制引用的对象。因此,原始对象及其副本引用同一对象。
- 深克隆:创建一个新的对象,并对其进行递归复制,不只是将当前对象的非静态字段复制到该新对象,而且还要将字段指向的所有对象都进行复制。所以,原始对象及其副本不引用同一对象。
总的来说,无论是原型模式,还是浅克隆、深克隆,他们的核心思想都是根据一个已存在的对象,快速地生成一个新的对象。这种方式特别适合于创建复杂对象或者创建对象的成本较大的情况。
总结
原型模式是设计模式中一个相当实用的模式,它帮助我们在保证性能的同时,完成对象的生成。它简化了对象的创建,提高了对象的复用性,但同时我们也要注意其所带来的问题。
如果上面的内容对你有帮助,请点赞收藏哦,我会分享更多的经验~
原文链接:https://juejin.cn/post/7324384083429589031 作者:程序员阿雷