

原型模式是一种创建型模式,它允许通过复制现有对象来创建新对象,而无需从头开始创建全新的对象。这种模式在软件系统中应用很广泛,特别是在需要创建大量相似或相同对象的情况下。
这种模式的主要想法是,在某个类(称为“原型类”)中定义一个方法,该方法用于创建并返回该类的另一个实例。这个新实例是原型的复制品,通过复制现有的对象来创建,而不是通过使用构造函数来创建新的对象。
在原型模式中,通过复制这个原型对象来创建新的对象。这个原型对象可以是任何类型的对象,包括基本数据类型、自定义对象、集合等。
抽象原型角色定义了原型对象的通用接口和行为
具体原型角色实现了抽象原型角色所定义的接口和行为,并提供了具体的实现细节。

在Java中,Cloneable接口是一个标记接口,用于指示一个对象可以被复制。它没有任何方法,只是一个标识符,用于指示实现Cloneable接口的类应该实现自己的复制方法。
要使一个对象可复制,需要实现clone()方法。该方法应该在类中定义为public和protected,并使用super.clone()调用超类的clone()方法来创建并返回一个新对象。新对象应该是原始对象的一个副本,包括所有字段和属性的副本。
机器狗这种玩意,其实在很早以前就被发明并制造出来了,小米科技也搞了一款,目前在官网上已经迭代到第二代了,你敢信这玩意居然卖到了12999元!可能有什么高科技在里面?

虽然这玩意能后空翻,但还是有点贵,这里咱们就用原型模式把价格打下来!

抽象产品类:Dog.java
- public interface Dog extends Cloneable {
- /**
- * 奔跑
- */
- void run();
-
- /**
- * 后空翻
- */
- void backflip();
- }
具体产品类:RoboticDog.java
- public class RoboticDog implements Dog{
-
- private String name="铁蛋";
-
- @Override
- protected Dog clone() throws CloneNotSupportedException {
- return (Dog) super.clone();
- }
-
- @Override
- public void run() {
- System.out.println(this.name+"在奔跑");
- }
-
- @Override
- public void backflip() {
- System.out.println(this.name+"在表演后空翻");
- }
- }
简单工厂类,用于批量生产机器狗这款产品,DamiFactory.java
- public class DaMiFactory {
- private Dog dog;
-
- public DaMiFactory(Dog dog) {
- this.dog = dog;
- }
-
- public Dog batchProduce(){
- if (dog != null&&dog instanceof RoboticDog) {
- try {
- return ((RoboticDog) dog).clone();
- } catch (CloneNotSupportedException e) {
- e.printStackTrace();
- }
- }
- return null;
- }
- }
测试类
- public class Test
- {
- public static void main(String[] args) {
- Dog roboticDog=new RoboticDog();
- DaMiFactory daMiFactory = new DaMiFactory(roboticDog);
- //开始批量生产
- for (int i = 0; i < 1000; i++) {
- System.out.println("第"+(i+1)+"只:");
- Dog dog = daMiFactory.batchProduce();
- dog.run();
- dog.backflip();
- }
-
- }
- }

在以下场景中,可以考虑使用原型模式:
在实际项目中,原型模式通常会和工厂方法模式一起出现,由工厂方法模式通过“clone”方法创建对象,然后提供给调用者。
总的来说,原型模式是一种非常实用的创建型模式,它可以在很多情况下提高代码的效率和复用性,在使用原型模式的时候需要特别注意使用场景。优点与缺点总是相对而言的,在某些场景下,原来的优点可能就变成缺点了,而在另外一些场景,缺点也有可能会变成优点,因此辩证的去理解,从实际出发做合理选择,这是根本目的。
