网站建设企业,做网站网站赚,图片制作器手机版在线,如何做一个网页前言 本文为 【23种设计模式】创建型模式详细介绍 相关内容介绍#xff0c;下边具体将对单例模式#xff0c;工厂方法模式#xff0c;抽象工厂模式#xff0c;建造者模式#xff0c;原型模式#xff0c;具体包括它们的特点与实现等进行详尽介绍~ 
#x1f4cc;博主主页下边具体将对单例模式工厂方法模式抽象工厂模式建造者模式原型模式具体包括它们的特点与实现等进行详尽介绍~ 
博主主页小新要变强 的主页 Java全栈学习路线可参考【Java全栈学习路线】最全的Java学习路线及知识清单Java自学方向指引内含最全Java全栈学习技术清单~ 算法刷题路线可参考算法刷题路线总结与相关资料分享内含最详尽的算法刷题路线指南及相关资料分享~ Java微服务开源项目可参考企业级Java微服务开源项目开源框架用于学习、毕设、公司项目、私活等减少开发工作让您只关注业务 目录 创建型模式详细介绍前言目录一、单例模式1️⃣介绍2️⃣实现二、工厂方法模式1️⃣介绍2️⃣实现三、抽象工厂模式1️⃣介绍2️⃣实现四、建造者模式1️⃣介绍2️⃣实现五、原型模式1️⃣介绍2️⃣实现后记一、单例模式 单例模式Singleton Pattern 是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式它提供了一种创建对象的最佳方式。 
这种模式涉及到一个单一的类该类负责创建自己的对象同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式可以直接访问不需要实例化该类的对象。 
注意 
1、单例类只能有一个实例。2、单例类必须自己创建自己的唯一实例。3、单例类必须给所有其他对象提供这一实例。 
1️⃣介绍 
意图 保证一个类仅有一个实例并提供一个访问它的全局访问点。 
主要解决 一个全局使用的类频繁地创建与销毁。 
何时使用 当您想控制实例数目节省系统资源的时候。 
如何解决 判断系统是否已经有这个单例如果有则返回如果没有则创建。 
关键代码 构造函数是私有的。 
应用实例 
1、一个班级只有一个班主任。2、Windows 是多进程多线程的在操作一个文件的时候就不可避免地出现多个进程或线程同时操作一个文件的现象所以所有文件的处理必须通过唯一的实例来进行。3、一些设备管理器常常设计为单例模式比如一个电脑有两台打印机在输出的时候就要处理不能两台打印机打印同一个文件。 
优点 
1、在内存里只有一个实例减少了内存的开销尤其是频繁的创建和销毁实例比如管理学院首页页面缓存。2、避免对资源的多重占用比如写文件操作。 
缺点 没有接口不能继承与单一职责原则冲突一个类应该只关心内部逻辑而不关心外面怎么样来实例化。 
使用场景 
1、要求生产唯一序列号。2、WEB 中的计数器不用每次刷新都在数据库里加一次用单例先缓存起来。3、创建的一个对象需要消耗的资源过多比如 I/O 与数据库的连接等。 
注意事项 getInstance() 方法中需要使用同步锁 synchronized (Singleton.class) 防止多线程同时进入造成 instance 被多次实例化。 
2️⃣实现 
我们将创建一个 SingleObject 类。SingleObject 类有它的私有构造函数和本身的一个静态实例。 
SingleObject 类提供了一个静态方法供外界获取它的静态实例。SingletonPatternDemo 类使用SingleObject 类来获取 SingleObject 对象。 1创建一个 Singleton 类 
SingleObject.java 
public class SingleObject {//创建 SingleObject 的一个对象private static SingleObject instance  new SingleObject();//让构造函数为 private这样该类就不会被实例化private SingleObject(){}//获取唯一可用的对象public static SingleObject getInstance(){return instance;}public void showMessage(){System.out.println(Hello World!);}
}2从 singleton 类获取唯一的对象 
SingletonPatternDemo.java 
public class SingletonPatternDemo {public static void main(String[] args) {//不合法的构造函数//编译时错误构造函数 SingleObject() 是不可见的//SingleObject object  new SingleObject();//获取唯一可用的对象SingleObject object  SingleObject.getInstance();//显示消息object.showMessage();}
}3执行程序 
输出结果 
Hello World!二、工厂方法模式 工厂方法模式Factory Pattern是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式它提供了一种创建对象的最佳方式。 
在工厂方法模式中我们在创建对象时不会对客户端暴露创建逻辑并且是通过使用一个共同的接口来指向新创建的对象。 
1️⃣介绍 
意图 定义一个创建对象的接口让其子类自己决定实例化哪一个工厂类工厂模式使其创建过程延迟到子类进行。 
主要解决 主要解决接口选择的问题。 
何时使用 我们明确地计划不同条件下创建不同实例时。 
如何解决 让其子类实现工厂接口返回的也是一个抽象的产品。 
关键代码 创建过程在其子类执行。 
应用实例 
1、您需要一辆汽车可以直接从工厂里面提货而不用去管这辆汽车是怎么做出来的以及这个汽车里面的具体实现。2、Hibernate 换数据库只需换方言和驱动就可以。 
优点 
1、一个调用者想创建一个对象只要知道其名称就可以了。2、扩展性高如果想增加一个产品只要扩展一个工厂类就可以。3、屏蔽产品的具体实现调用者只关心产品的接口。 
缺点 每次增加一个产品时都需要增加一个具体类和对象实现工厂使得系统中类的个数成倍增加在一定程度上增加了系统的复杂度同时也增加了系统具体类的依赖。这并不是什么好事。 
使用场景 
1、日志记录器记录可能记录到本地硬盘、系统事件、远程服务器等用户可以选择记录日志到什么地方。2、数据库访问当用户不知道最后系统采用哪一类数据库以及数据库可能有变化时。3、设计一个连接服务器的框架需要三个协议“POP3”、“IMAP”、“HTTP”可以把这三个作为产品类共同实现一个接口。 
注意事项 作为一种创建类模式在任何需要生成复杂对象的地方都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式而简单对象特别是只需要通过 new 就可以完成创建的对象无需使用工厂模式。如果使用工厂模式就需要引入一个工厂类会增加系统的复杂度。 
2️⃣实现 
我们将创建一个 Shape 接口和实现 Shape 接口的实体类。下一步是定义工厂类 ShapeFactory。 
FactoryPatternDemo 类使用 ShapeFactory 来获取 Shape 对象。它将向 ShapeFactory 传递信息CIRCLE / RECTANGLE / SQUARE以便获取它所需对象的类型。 1创建一个接口 
Shape.java 
public interface Shape {void draw();
}2创建实现接口的实体类 
Rectangle.java 
public class Rectangle implements Shape {Overridepublic void draw() {System.out.println(Inside Rectangle::draw() method.);}
}Square.java 
public class Square implements Shape {Overridepublic void draw() {System.out.println(Inside Square::draw() method.);}
}Circle.java 
public class Circle implements Shape {Overridepublic void draw() {System.out.println(Inside Circle::draw() method.);}
}3创建一个工厂生成基于给定信息的实体类的对象 
ShapeFactory.java 
public class ShapeFactory {//使用 getShape 方法获取形状类型的对象public Shape getShape(String shapeType){if(shapeType  null){return null;}        if(shapeType.equalsIgnoreCase(CIRCLE)){return new Circle();} else if(shapeType.equalsIgnoreCase(RECTANGLE)){return new Rectangle();} else if(shapeType.equalsIgnoreCase(SQUARE)){return new Square();}return null;}
}4使用该工厂通过传递类型信息来获取实体类的对象 
FactoryPatternDemo.java 
public class FactoryPatternDemo {public static void main(String[] args) {ShapeFactory shapeFactory  new ShapeFactory();//获取 Circle 的对象并调用它的 draw 方法Shape shape1  shapeFactory.getShape(CIRCLE);//调用 Circle 的 draw 方法shape1.draw();//获取 Rectangle 的对象并调用它的 draw 方法Shape shape2  shapeFactory.getShape(RECTANGLE);//调用 Rectangle 的 draw 方法shape2.draw();//获取 Square 的对象并调用它的 draw 方法Shape shape3  shapeFactory.getShape(SQUARE);//调用 Square 的 draw 方法shape3.draw();}
}5执行程序 
输出结果 
Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.三、抽象工厂模式 抽象工厂模式Abstract Factory Pattern是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式它提供了一种创建对象的最佳方式。 
在抽象工厂模式中接口是负责创建一个相关对象的工厂不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。 
1️⃣介绍 
意图 提供一个创建一系列相关或相互依赖对象的接口而无需指定它们具体的类。 
主要解决 主要解决接口选择的问题。 
何时使用 系统的产品有多于一个的产品族而系统只消费其中某一族的产品。 
如何解决 在一个产品族里面定义多个产品。 
关键代码 在一个工厂里聚合多个同类产品。 
应用实例 工作了为了参加一些聚会肯定有两套或多套衣服吧比如说有商务装成套一系列具体产品、时尚装成套一系列具体产品甚至对于一个家庭来说可能有商务女装、商务男装、时尚女装、时尚男装这些也都是成套的即一系列具体产品。假设一种情况现实中是不存在的要不然没法进入共产主义了但有利于说明抽象工厂模式在您的家中某一个衣柜具体工厂只能存放某一种这样的衣服成套一系列具体产品每次拿这种成套的衣服时也自然要从这个衣柜中取出了。用 OOP 的思想去理解所有的衣柜具体工厂都是衣柜类的抽象工厂某一个而每一件成套的衣服又包括具体的上衣某一具体产品裤子某一具体产品这些具体的上衣其实也都是上衣抽象产品具体的裤子也都是裤子另一个抽象产品。 
优点 当一个产品族中的多个对象被设计成一起工作时它能保证客户端始终只使用同一个产品族中的对象。 
缺点 产品族扩展非常困难要增加一个系列的某一产品既要在抽象的 Creator 里加代码又要在具体的里面加代码。 
使用场景 
1、QQ 换皮肤一整套一起换。2、生成不同操作系统的程序。 
注意事项 产品族难扩展产品等级易扩展。 
2️⃣实现 
我们将创建 Shape 和 Color 接口和实现这些接口的实体类。下一步是创建抽象工厂类 AbstractFactory。接着定义工厂类 ShapeFactory 和 ColorFactory这两个工厂类都是扩展了 AbstractFactory。然后创建一个工厂创造器/生成器类 FactoryProducer。 
AbstractFactoryPatternDemo 类使用 FactoryProducer 来获取 AbstractFactory 对象。它将向 AbstractFactory 传递形状信息 ShapeCIRCLE / RECTANGLE / SQUARE以便获取它所需对象的类型。同时它还向 AbstractFactory 传递颜色信息 ColorRED / GREEN / BLUE以便获取它所需对象的类型。 1为形状创建一个接口 
Shape.java 
public interface Shape {void draw();
}2创建实现接口的实体类 
Rectangle.java 
public class Rectangle implements Shape {Overridepublic void draw() {System.out.println(Inside Rectangle::draw() method.);}
}Square.java 
public class Square implements Shape {Overridepublic void draw() {System.out.println(Inside Square::draw() method.);}
}Circle.java 
public class Circle implements Shape {Overridepublic void draw() {System.out.println(Inside Circle::draw() method.);}
}3为颜色创建一个接口 
Color.java 
public interface Color {void fill();
}4创建实现接口的实体类 
Red.java 
public class Red implements Color {Overridepublic void fill() {System.out.println(Inside Red::fill() method.);}
}Green.java 
public class Green implements Color {Overridepublic void fill() {System.out.println(Inside Green::fill() method.);}
}Blue.java 
public class Blue implements Color {Overridepublic void fill() {System.out.println(Inside Blue::fill() method.);}
}5为 Color 和 Shape 对象创建抽象类来获取工厂 
AbstractFactory.java 
public abstract class AbstractFactory {public abstract Color getColor(String color);public abstract Shape getShape(String shape);
}6创建扩展了 AbstractFactory 的工厂类基于给定的信息生成实体类的对象 
ShapeFactory.java 
public class ShapeFactory extends AbstractFactory {Overridepublic Shape getShape(String shapeType){if(shapeType  null){return null;}        if(shapeType.equalsIgnoreCase(CIRCLE)){return new Circle();} else if(shapeType.equalsIgnoreCase(RECTANGLE)){return new Rectangle();} else if(shapeType.equalsIgnoreCase(SQUARE)){return new Square();}return null;}Overridepublic Color getColor(String color) {return null;}
}ColorFactory.java 
public class ColorFactory extends AbstractFactory {Overridepublic Shape getShape(String shapeType){return null;}Overridepublic Color getColor(String color) {if(color  null){return null;}        if(color.equalsIgnoreCase(RED)){return new Red();} else if(color.equalsIgnoreCase(GREEN)){return new Green();} else if(color.equalsIgnoreCase(BLUE)){return new Blue();}return null;}
}7创建一个工厂创造器/生成器类通过传递形状或颜色信息来获取工厂 
FactoryProducer.java 
public class FactoryProducer {public static AbstractFactory getFactory(String choice){if(choice.equalsIgnoreCase(SHAPE)){return new ShapeFactory();} else if(choice.equalsIgnoreCase(COLOR)){return new ColorFactory();}return null;}
}8使用 FactoryProducer 来获取 AbstractFactory通过传递类型信息来获取实体类的对象 
AbstractFactoryPatternDemo.java 
public class AbstractFactoryPatternDemo {public static void main(String[] args) {//获取形状工厂AbstractFactory shapeFactory  FactoryProducer.getFactory(SHAPE);//获取形状为 Circle 的对象Shape shape1  shapeFactory.getShape(CIRCLE);//调用 Circle 的 draw 方法shape1.draw();//获取形状为 Rectangle 的对象Shape shape2  shapeFactory.getShape(RECTANGLE);//调用 Rectangle 的 draw 方法shape2.draw();//获取形状为 Square 的对象Shape shape3  shapeFactory.getShape(SQUARE);//调用 Square 的 draw 方法shape3.draw();//获取颜色工厂AbstractFactory colorFactory  FactoryProducer.getFactory(COLOR);//获取颜色为 Red 的对象Color color1  colorFactory.getColor(RED);//调用 Red 的 fill 方法color1.fill();//获取颜色为 Green 的对象Color color2  colorFactory.getColor(GREEN);//调用 Green 的 fill 方法color2.fill();//获取颜色为 Blue 的对象Color color3  colorFactory.getColor(BLUE);//调用 Blue 的 fill 方法color3.fill();}
}9执行程序 
输出结果 
Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.
Inside Red::fill() method.
Inside Green::fill() method.
Inside Blue::fill() method.四、建造者模式 建造者模式Builder Pattern使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式它提供了一种创建对象的最佳方式。 
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。 
1️⃣介绍 
意图 将一个复杂的构建与其表示相分离使得同样的构建过程可以创建不同的表示。 
主要解决 主要解决在软件系统中有时候面临着一个复杂对象的创建工作其通常由各个部分的子对象用一定的算法构成由于需求的变化这个复杂对象的各个部分经常面临着剧烈的变化但是将它们组合在一起的算法却相对稳定。 
何时使用 一些基本部件不会变而其组合经常变化的时候。 
如何解决 将变与不变分离开。 
关键代码 建造者创建和提供实例导演管理建造出来的实例的依赖关系。 
应用实例 
1、去肯德基汉堡、可乐、薯条、炸鸡翅等是不变的而其组合是经常变化的生成出所谓的套餐。2、JAVA 中的 StringBuilder。 
优点 
1、建造者独立易扩展。2、便于控制细节风险。 
缺点 1、产品必须有共同点范围有限制。  2、如内部变化复杂会有很多的建造类。  
使用场景 
1、需要生成的对象具有复杂的内部结构。2、需要生成的对象内部属性本身相互依赖。 
注意事项 与工厂模式的区别是建造者模式更加关注与零件装配的顺序。 
2️⃣实现 
我们假设一个快餐店的商业案例其中一个典型的套餐可以是一个汉堡Burger和一杯冷饮Cold drink。汉堡Burger可以是素食汉堡Veg Burger或鸡肉汉堡Chicken Burger它们是包在纸盒中。冷饮Cold drink可以是可口可乐coke或百事可乐pepsi它们是装在瓶子中。 
我们将创建一个表示食物条目比如汉堡和冷饮的 Item 接口和实现 Item 接口的实体类以及一个表示食物包装的 Packing 接口和实现 Packing 接口的实体类汉堡是包在纸盒中冷饮是装在瓶子中。 
然后我们创建一个 Meal 类带有 Item 的 ArrayList 和一个通过结合 Item 来创建不同类型的 Meal 对象的 MealBuilder。BuilderPatternDemo 类使用 MealBuilder 来创建一个 Meal。 1创建一个表示食物条目和食物包装的接口 
Item.java 
public interface Item {public String name();public Packing packing();public float price();    
}Packing.java 
public interface Packing {public String pack();
}2创建实现 Packing 接口的实体类 
Wrapper.java 
public class Wrapper implements Packing {Overridepublic String pack() {return Wrapper;}
}Bottle.java 
public class Bottle implements Packing {Overridepublic String pack() {return Bottle;}
}3创建实现 Item 接口的抽象类该类提供了默认的功能 
Burger.java 
public abstract class Burger implements Item {Overridepublic Packing packing() {return new Wrapper();}Overridepublic abstract float price();
}ColdDrink.java 
public abstract class ColdDrink implements Item {Overridepublic Packing packing() {return new Bottle();}Overridepublic abstract float price();
}4创建扩展了 Burger 和 ColdDrink 的实体类。 
VegBurger.java 
public class VegBurger extends Burger {Overridepublic float price() {return 25.0f;}Overridepublic String name() {return Veg Burger;}
}ChickenBurger.java 
public class ChickenBurger extends Burger {Overridepublic float price() {return 50.5f;}Overridepublic String name() {return Chicken Burger;}
}Coke.java 
public class Coke extends ColdDrink {Overridepublic float price() {return 30.0f;}Overridepublic String name() {return Coke;}
}Pepsi.java 
public class Pepsi extends ColdDrink {Overridepublic float price() {return 35.0f;}Overridepublic String name() {return Pepsi;}
}5创建一个 Meal 类带有上面定义的 Item 对象 
Meal.java 
import java.util.ArrayList;
import java.util.List;public class Meal {private ListItem items  new ArrayListItem();    public void addItem(Item item){items.add(item);}public float getCost(){float cost  0.0f;for (Item item : items) {cost  item.price();}        return cost;}public void showItems(){for (Item item : items) {System.out.print(Item : item.name());System.out.print(, Packing : item.packing().pack());System.out.println(, Price : item.price());}        }    
}6创建一个 MealBuilder 类实际的 builder 类负责创建 Meal 对象 
MealBuilder.java 
public class MealBuilder {public Meal prepareVegMeal (){Meal meal  new Meal();meal.addItem(new VegBurger());meal.addItem(new Coke());return meal;}   public Meal prepareNonVegMeal (){Meal meal  new Meal();meal.addItem(new ChickenBurger());meal.addItem(new Pepsi());return meal;}
}7BuiderPatternDemo 使用 MealBuilder 来演示建造者模式Builder Pattern 
BuilderPatternDemo.java 
public class BuilderPatternDemo {public static void main(String[] args) {MealBuilder mealBuilder  new MealBuilder();Meal vegMeal  mealBuilder.prepareVegMeal();System.out.println(Veg Meal);vegMeal.showItems();System.out.println(Total Cost:  vegMeal.getCost());Meal nonVegMeal  mealBuilder.prepareNonVegMeal();System.out.println(\n\nNon-Veg Meal);nonVegMeal.showItems();System.out.println(Total Cost:  nonVegMeal.getCost());}
}8执行程序 
输出结果 
Veg Meal
Item : Veg Burger, Packing : Wrapper, Price : 25.0
Item : Coke, Packing : Bottle, Price : 30.0
Total Cost: 55.0Non-Veg Meal
Item : Chicken Burger, Packing : Wrapper, Price : 50.5
Item : Pepsi, Packing : Bottle, Price : 35.0
Total Cost: 85.5五、原型模式 原型模式Prototype Pattern是用于创建重复的对象同时又能保证性能。这种类型的设计模式属于创建型模式它提供了一种创建对象的最佳方式。 
这种模式是实现了一个原型接口该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时则采用这种模式。例如一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象在下一个请求时返回它的克隆在需要的时候更新数据库以此来减少数据库调用。 
1️⃣介绍 
意图 用原型实例指定创建对象的种类并且通过拷贝这些原型创建新的对象。 
主要解决 在运行期建立和删除原型。 
何时使用 
1、当一个系统应该独立于它的产品创建构成和表示时。2、当要实例化的类是在运行时刻指定时例如通过动态装载。3、为了避免创建一个与产品类层次平行的工厂类层次时。4、当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。 
如何解决 利用已有的一个原型对象快速地生成和原型对象一样的实例。 
关键代码 
1、实现克隆操作在 JAVA 实现 Cloneable 接口重写 clone()在 .NET 中可以使用 Object 类的MemberwiseClone() 方法来实现对象的浅拷贝或通过序列化的方式来实现深拷贝。2、原型模式同样用于隔离类对象的使用者和具体类型易变类之间的耦合关系它同样要求这些易变类拥有稳定的接口。 
应用实例 
1、细胞分裂。2、JAVA 中的 Object clone() 方法。 
优点 
1、性能提高。2、逃避构造函数的约束。 
缺点 
1、配备克隆方法需要对类的功能进行通盘考虑这对于全新的类不是很难但对于已有的类不一定很容易特别当一个类引用不支持串行化的间接对象或者引用含有循环结构的时候。2、必须实现 Cloneable 接口。 
使用场景 
1、资源优化场景。2、类初始化需要消化非常多的资源这个资源包括数据、硬件资源等。3、性能和安全要求的场景。4、通过 new 产生一个对象需要非常繁琐的数据准备或访问权限则可以使用原型模式。5、一个对象多个修改者的场景。6、一个对象需要提供给其他对象访问而且各个调用者可能都需要修改其值时可以考虑使用原型模式拷贝多个对象供调用者使用。7、在实际项目中原型模式很少单独出现一般是和工厂方法模式一起出现通过 clone的方法创建一个对象然后由工厂方法提供给调用者。原型模式已经与 Java 融为浑然一体大家可以随手拿来使用。 
注意事项 与通过对一个类进行实例化来构造新对象不同的是原型模式是通过拷贝一个现有对象生成新对象的。浅拷贝实现 Cloneable重写深拷贝是通过实现 Serializable 读取二进制流。 
2️⃣实现 
我们将创建一个抽象类 Shape 和扩展了 Shape 类的实体类。下一步是定义类 ShapeCache该类把 shape 对象存储在一个 Hashtable 中并在请求的时候返回它们的克隆。 
PrototypePatternDemo 类使用 ShapeCache 类来获取 Shape 对象。 1创建一个实现了 Cloneable 接口的抽象类 
Shape.java 
public abstract class Shape implements Cloneable {private String id;protected String type;abstract void draw();public String getType(){return type;}public String getId() {return id;}public void setId(String id) {this.id  id;}public Object clone() {Object clone  null;try {clone  super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return clone;}
}2创建扩展了上面抽象类的实体类 
Rectangle.java 
public class Rectangle extends Shape {public Rectangle(){type  Rectangle;}Overridepublic void draw() {System.out.println(Inside Rectangle::draw() method.);}
}Square.java 
public class Square extends Shape {public Square(){type  Square;}Overridepublic void draw() {System.out.println(Inside Square::draw() method.);}
}Circle.java 
public class Circle extends Shape {public Circle(){type  Circle;}Overridepublic void draw() {System.out.println(Inside Circle::draw() method.);}
}3创建一个类从数据库获取实体类并把它们存储在一个 Hashtable 中 
ShapeCache.java 
import java.util.Hashtable;public class ShapeCache {private static HashtableString, Shape shapeMap  new HashtableString, Shape();public static Shape getShape(String shapeId) {Shape cachedShape  shapeMap.get(shapeId);return (Shape) cachedShape.clone();}// 对每种形状都运行数据库查询并创建该形状// shapeMap.put(shapeKey, shape);// 例如我们要添加三种形状public static void loadCache() {Circle circle  new Circle();circle.setId(1);shapeMap.put(circle.getId(),circle);Square square  new Square();square.setId(2);shapeMap.put(square.getId(),square);Rectangle rectangle  new Rectangle();rectangle.setId(3);shapeMap.put(rectangle.getId(),rectangle);}
}4PrototypePatternDemo 使用 ShapeCache 类来获取存储在 Hashtable 中的形状的克隆 
PrototypePatternDemo.java 
public class PrototypePatternDemo {public static void main(String[] args) {ShapeCache.loadCache();Shape clonedShape  (Shape) ShapeCache.getShape(1);System.out.println(Shape :   clonedShape.getType());        Shape clonedShape2  (Shape) ShapeCache.getShape(2);System.out.println(Shape :   clonedShape2.getType());        Shape clonedShape3  (Shape) ShapeCache.getShape(3);System.out.println(Shape :   clonedShape3.getType());        }
}5执行程序 
输出结果 
Shape : Circle
Shape : Square
Shape : Rectangle后记 Java全栈学习路线可参考【Java全栈学习路线】最全的Java学习路线及知识清单Java自学方向指引内含最全Java全栈学习技术清单~ 算法刷题路线可参考算法刷题路线总结与相关资料分享内含最详尽的算法刷题路线指南及相关资料分享~ 文章转载自: http://www.morning.mxnfh.cn.gov.cn.mxnfh.cn http://www.morning.bybhj.cn.gov.cn.bybhj.cn http://www.morning.ndmh.cn.gov.cn.ndmh.cn http://www.morning.dcccl.cn.gov.cn.dcccl.cn http://www.morning.nkiqixr.cn.gov.cn.nkiqixr.cn http://www.morning.rmkyb.cn.gov.cn.rmkyb.cn http://www.morning.krhkb.cn.gov.cn.krhkb.cn http://www.morning.qsmch.cn.gov.cn.qsmch.cn http://www.morning.sqxr.cn.gov.cn.sqxr.cn http://www.morning.lpyjq.cn.gov.cn.lpyjq.cn http://www.morning.tqsmc.cn.gov.cn.tqsmc.cn http://www.morning.kdgcx.cn.gov.cn.kdgcx.cn http://www.morning.ptmsk.cn.gov.cn.ptmsk.cn http://www.morning.gqhgl.cn.gov.cn.gqhgl.cn http://www.morning.tpmnq.cn.gov.cn.tpmnq.cn http://www.morning.frpb.cn.gov.cn.frpb.cn http://www.morning.qbtj.cn.gov.cn.qbtj.cn http://www.morning.lqqqh.cn.gov.cn.lqqqh.cn http://www.morning.htjwz.cn.gov.cn.htjwz.cn http://www.morning.zcnfm.cn.gov.cn.zcnfm.cn http://www.morning.lxmmx.cn.gov.cn.lxmmx.cn http://www.morning.kspfq.cn.gov.cn.kspfq.cn http://www.morning.kryxk.cn.gov.cn.kryxk.cn http://www.morning.qzfjl.cn.gov.cn.qzfjl.cn http://www.morning.bcjbm.cn.gov.cn.bcjbm.cn http://www.morning.lzqxb.cn.gov.cn.lzqxb.cn http://www.morning.ykklw.cn.gov.cn.ykklw.cn http://www.morning.yfcyh.cn.gov.cn.yfcyh.cn http://www.morning.nwczt.cn.gov.cn.nwczt.cn http://www.morning.gybnk.cn.gov.cn.gybnk.cn http://www.morning.dysgr.cn.gov.cn.dysgr.cn http://www.morning.kszkm.cn.gov.cn.kszkm.cn http://www.morning.bxrlt.cn.gov.cn.bxrlt.cn http://www.morning.gyrdn.cn.gov.cn.gyrdn.cn http://www.morning.pdkht.cn.gov.cn.pdkht.cn http://www.morning.rtlrz.cn.gov.cn.rtlrz.cn http://www.morning.ailvturv.com.gov.cn.ailvturv.com http://www.morning.xnqwk.cn.gov.cn.xnqwk.cn http://www.morning.lpsjs.com.gov.cn.lpsjs.com http://www.morning.tpqrc.cn.gov.cn.tpqrc.cn http://www.morning.yfcyh.cn.gov.cn.yfcyh.cn http://www.morning.rgdcf.cn.gov.cn.rgdcf.cn http://www.morning.ynstj.cn.gov.cn.ynstj.cn http://www.morning.qqnh.cn.gov.cn.qqnh.cn http://www.morning.rbktw.cn.gov.cn.rbktw.cn http://www.morning.xhqwm.cn.gov.cn.xhqwm.cn http://www.morning.mxlmn.cn.gov.cn.mxlmn.cn http://www.morning.dongyinet.cn.gov.cn.dongyinet.cn http://www.morning.ydflc.cn.gov.cn.ydflc.cn http://www.morning.newfeiya.com.cn.gov.cn.newfeiya.com.cn http://www.morning.mfsjn.cn.gov.cn.mfsjn.cn http://www.morning.krrjb.cn.gov.cn.krrjb.cn http://www.morning.tytly.cn.gov.cn.tytly.cn http://www.morning.ylxgw.cn.gov.cn.ylxgw.cn http://www.morning.rlxg.cn.gov.cn.rlxg.cn http://www.morning.sxfmg.cn.gov.cn.sxfmg.cn http://www.morning.rttkl.cn.gov.cn.rttkl.cn http://www.morning.fxzgw.com.gov.cn.fxzgw.com http://www.morning.jwskq.cn.gov.cn.jwskq.cn http://www.morning.kpxky.cn.gov.cn.kpxky.cn http://www.morning.mntxalcb.com.gov.cn.mntxalcb.com http://www.morning.tnyanzou.com.gov.cn.tnyanzou.com http://www.morning.dpdr.cn.gov.cn.dpdr.cn http://www.morning.nkcfh.cn.gov.cn.nkcfh.cn http://www.morning.rqjxc.cn.gov.cn.rqjxc.cn http://www.morning.dongyinet.cn.gov.cn.dongyinet.cn http://www.morning.jzfrl.cn.gov.cn.jzfrl.cn http://www.morning.ghrlx.cn.gov.cn.ghrlx.cn http://www.morning.lbxcc.cn.gov.cn.lbxcc.cn http://www.morning.kwnnx.cn.gov.cn.kwnnx.cn http://www.morning.zwgbz.cn.gov.cn.zwgbz.cn http://www.morning.ztqyj.cn.gov.cn.ztqyj.cn http://www.morning.pxbrg.cn.gov.cn.pxbrg.cn http://www.morning.krkwh.cn.gov.cn.krkwh.cn http://www.morning.mnbgx.cn.gov.cn.mnbgx.cn http://www.morning.hqykb.cn.gov.cn.hqykb.cn http://www.morning.ndtzy.cn.gov.cn.ndtzy.cn http://www.morning.gfqjf.cn.gov.cn.gfqjf.cn http://www.morning.fkmrj.cn.gov.cn.fkmrj.cn http://www.morning.slzkq.cn.gov.cn.slzkq.cn