赞
踩
这类模式提供了对象创建机制,增加了程序的灵活性和复用性。记忆方法:想见员工丹。
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式是工厂方法模式的一种扩展,它用于处理多维度的大规模产品族,而不是单一产品的创建问题。
抽象工厂模式可以想象成一个大型工厂,这个大工厂里有好几个小工厂,每个小工厂负责生产一系列相关的产品。这种设计模式的核心就是帮助我们在不直接指定具体类的情况下创建一系列相关或依赖对象。
.
来个更生活化的比喻:假设你现在要装修一个新房子,你需要一套家具,包括沙发、咖啡桌和电视柜。你当然希望这些家具风格相配,要么是现代简约风,要么是经典欧式风,而不是混搭风。
.
如果用抽象工厂模式来解决这个问题,那么“家具工厂”就是一个“抽象工厂”,它能够提供一系列相关的产品:沙发、咖啡桌、电视柜。而具体生产这些家具的,则是它下面的“具体工厂”,比如“现代简约风家具工厂”和“经典欧式风家具工厂”。你只需要告诉它,我需要一套“现代简约风”的家具,剩下的事情就交给它去做,它会给你一套风格统一的家具。
抽象工厂模式主要用于以下情景:
抽象工厂模式通常包含以下几个角色:
优点
缺点
以下是一个简化的抽象工厂模式示例,展示了如何创建两种不同的UI组件族:Light 和 Dark。
// 抽象产品:按钮 interface Button { void paint(); } // 具体产品:浅色按钮 class LightButton implements Button { public void paint() { System.out.println("Rendering light button"); } } // 具体产品:深色按钮 class DarkButton implements Button { public void paint() { System.out.println("Rendering dark button"); } } // 抽象工厂 interface GUIFactory { Button createButton(); } // 具体工厂:创建浅色UI组件 class LightGUIFactory implements GUIFactory { public Button createButton() { return new LightButton(); } } // 具体工厂:创建深色UI组件 class DarkGUIFactory implements GUIFactory { public Button createButton() { return new DarkButton(); } }
客户端代码
public class Client { private Button button; public Client(GUIFactory factory) { button = factory.createButton(); } public void paint() { button.paint(); } public static void main(String[] args) { // 使用浅色主题 GUIFactory lightFactory = new LightGUIFactory(); Client client1 = new Client(lightFactory); client1.paint(); // 使用深色主题 GUIFactory darkFactory = new DarkGUIFactory(); Client client2 = new Client(darkFactory); client2.paint(); } }
在这个例子中,GUIFactory
是一个抽象工厂,它有两个具体的实现:LightGUIFactory
和 DarkGUIFactory
,分别用于创建浅色和深色主题的按钮。客户端代码不直接实例化产品对象,而是通过工厂接口,这使得添加新的产品族或更改产品族变得容易,且客户端代码不需要改变。
允许创建复杂对象的步骤被分解,使用相同的创建过程可以创建不同的表示。
建造者模式(Builder Pattern)是一种创建型设计模式,旨在解决对象构建过程复杂、需要多步骤和多个部件组装的问题。它允许你分步骤创建复杂对象,将对象构建过程与其表示分离,使得相同的构建过程可以创建不同的表示。
建造者模式就像是搭积木一样,把一个复杂的东西分成很多小块,然后一块一块地慢慢搭建起来。比如,你要建一栋房子,房子里有很多部分,比如墙壁、窗户、门等等,每个部分都有自己的构建步骤。建造者模式就像是有一群专门负责建造这些部分的工人,每个工人负责一部分,最后把所有部分组合起来就得到了完整的房子。
.
在这个过程中,你不需要亲自去指挥每个工人怎么做,而是交给一个指挥者来管理,指挥者知道每个部分应该由哪个工人来负责,然后按照规定的顺序组织工人们一起完成建造。这样一来,不仅分工明确、井然有序,而且如果需要改变建造过程,也很容易调整,只需修改指挥者的指导方针,而不用改动每个工人的具体工作步骤。
建造者模式主要用于以下情景:
建造者模式包含以下几个核心角色:
分步构建:允许你按照特定顺序或逻辑构建对象的各个部件,使得构建过程更加灵活和可控。
隐藏细节:将对象的构建过程与其表示分离,客户端不需要知道具体的构建细节。 复用性:可以使用相同的构建过程创建不同的表示,提高代码复用性。
易于扩展:添加新的具体建造者或修改现有建造者对于系统的扩展和维护都比较容易。
以下是一个简化的建造者模式示例,假设我们要构建一份电脑产品,电脑包含 CPU、内存、硬盘等部件。
// 产品:电脑 class Computer { private String cpu; private String memory; private String hardDisk; public void setCpu(String cpu) { this.cpu = cpu; } public void setMemory(String memory) { this.memory = memory; } public void setHardDisk(String hardDisk) { this.hardDisk = hardDisk; } public String getInfo() { return "CPU: " + cpu + ", Memory: " + memory + ", Hard Disk: " + hardDisk; } } // 抽象建造者 interface ComputerBuilder { void buildCPU(); void buildMemory(); void buildHardDisk(); Computer getComputer(); } // 具体建造者:高配版 class HighEndComputerBuilder implements ComputerBuilder { private Computer computer = new Computer(); public void buildCPU() { computer.setCpu("Intel i9"); } public void buildMemory() { computer.setMemory("32GB DDR4"); } public void buildHardDisk() { computer.setHardDisk("1TB SSD"); } public Computer getComputer() { return computer; } } // 指挥者 class Director { private ComputerBuilder builder; public Director(ComputerBuilder builder) { this.builder = builder; } public void constructComputer() { builder.buildCPU(); builder.buildMemory(); builder.buildHardDisk(); } }
客户端代码
public class Client {
public static void main(String[] args) {
ComputerBuilder builder = new HighEndComputerBuilder();
Director director = new Director(builder);
director.constructComputer();
Computer computer = builder.getComputer();
System.out.println(computer.getInfo());
}
}
在这个例子中,Computer
是产品,具有 CPU、内存、硬盘等属性。ComputerBuilder
是抽象建造者接口,定义了构建电脑的抽象方法。HighEndComputerBuilder
是具体建造者,实现了具体的构建过程。Director
是指挥者,负责使用具体建造者构建产品。
通过建造者模式,我们可以按照特定的顺序或逻辑构建电脑对象,客户端代码不需要关心具体的构建过程,只需要通过指挥者来获取构建完成的产品。
通过复制现有对象的方式创建新对象,避免了与对象类耦合。
原型模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而无需知道对象的具体类型或如何创建对象。这种模式的核心思想是基于现有对象来生成新对象,而不是通过实例化类来创建新对象。
原型模式包含以下几个核心角色:
原型模式的工作原理如下:
定义一个原型接口,其中包含一个克隆方法,用于生成新对象。 创建具体原型类,实现原型接口,并在克隆方法中进行对象的复制操作。
在客户端代码中,通过调用具体原型类的克隆方法来生成新对象,而不是通过实例化类来创建对象。
原型模式适用于以下场景:
当需要创建的对象包含复杂的构建过程,而且这个过程的开销比较大时,可以使用原型模式来提高性能。
当需要创建的对象与已有对象相似,只有部分属性不同,可以使用原型模式来快速生成变体对象。
当需要避免类之间的耦合关系,而又需要通过复制对象来创建新对象时,可以使用原型模式。
优点
性能提升:避免了重复创建复杂对象的开销,通过复制现有对象可以快速生成新对象。
简化对象创建:不需要关心对象的具体创建过程,只需要复制一个现有对象即可。
灵活性:可以在运行时动态地克隆对象,而不需要修改代码。
缺点
对象构建过程复杂:如果对象包含的部分属性是引用类型,并且需要深度复制,会增加代码复杂度。
需要注意浅拷贝与深拷贝:如果对象内部有引用类型的成员变量,需要考虑是否需要进行深拷贝,否则可能会造成对象状态共享问题。
以下是一个简单的示例代码,展示了如何使用原型模式创建克隆对象。
// 原型接口 interface Prototype { Prototype clone(); void setProperty(String property); String getProperty(); } // 具体原型类 class ConcretePrototype implements Prototype { private String property; public Prototype clone() { ConcretePrototype cloned = new ConcretePrototype(); cloned.setProperty(this.property); return cloned; } public void setProperty(String property) { this.property = property; } public String getProperty() { return this.property; } }
客户端代码
public class Client { public static void main(String[] args) { // 创建原型对象 ConcretePrototype prototype = new ConcretePrototype(); prototype.setProperty("Original Property"); // 克隆原型对象 Prototype clonedPrototype = prototype.clone(); System.out.println("Original Prototype Property: " + prototype.getProperty()); System.out.println("Cloned Prototype Property: " + clonedPrototype.getProperty()); // 修改克隆对象的属性 ((ConcretePrototype) clonedPrototype).setProperty("Modified Property"); System.out.println("Modified Cloned Prototype Property: " + clonedPrototype.getProperty()); } }
在这个示例中,Prototype
是原型接口,定义了克隆方法和一些操作属性的方法。ConcretePrototype
是具体原型类,实现了原型接口,并在克隆方法中进行了对象的复制操作。在客户端代码中,我们先创建了一个原型对象,并设置了属性值,然后通过克隆方法生成了一个克隆对象,并输出属性值,最后修改了克隆对象的属性并输出。
运行以上代码会输出以下结果:
Original Prototype Property: Original Property
Cloned Prototype Property: Original Property
Modified Cloned Prototype Property: Modified Property
可以看到,通过原型模式成功地生成了克隆对象,并且可以对克隆对象进行修改而不影响原型对象。
在父类中提供一个创建对象的接口,让子类决定实例化哪一个类。
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它提供了一个将对象创建的过程延迟到子类的接口。工厂方法模式的核心思想是定义一个创建对象的接口,但让子类决定实例化哪个类。这样可以将对象的创建和使用分离,使得系统更加灵活,能够根据需要动态地选择和创建对象。
工厂方法模式的工作流程如下:
定义一个抽象工厂接口,声明一个工厂方法用于创建产品对象。
创建具体产品类,实现抽象产品接口,定义产品的具体功能。
创建具体工厂类,实现抽象工厂接口,实现工厂方法用于创建具体产品对象。
在客户端代码中,通过实例化具体工厂类并调用工厂方法来创建具体产品对象,而不是直接实例化具体产品类。
工厂方法模式主要用于以下情景:
工厂方法模式包含以下几个核心角色:
优点
缺点
以下是一个简化的工厂方法模式示例,展示了如何使用工厂方法模式创建具体产品对象。
// 抽象产品接口 interface Product { void operation(); } // 具体产品类A class ConcreteProductA implements Product { public void operation() { System.out.println("Product A operation"); } } // 具体产品类B class ConcreteProductB implements Product { public void operation() { System.out.println("Product B operation"); } } // 抽象工厂接口 interface Factory { Product createProduct(); } // 具体工厂类A class ConcreteFactoryA implements Factory { public Product createProduct() { return new ConcreteProductA(); } } // 具体工厂类B class ConcreteFactoryB implements Factory { public Product createProduct() { return new ConcreteProductB(); } }
客户端代码
public class Client {
public static void main(String[] args) {
Factory factoryA = new ConcreteFactoryA();
Product productA = factoryA.createProduct();
productA.operation();
Factory factoryB = new ConcreteFactoryB();
Product productB = factoryB.createProduct();
productB.operation();
}
}
在这个示例中,Product
是抽象产品接口,定义了产品的操作方法。ConcreteProductA
和 ConcreteProductB
是具体产品类,实现了抽象产品接口。Factory
是抽象工厂接口,声明了一个工厂方法用于创建产品对象。ConcreteFactoryA
和 ConcreteFactoryB
是具体工厂类,实现了抽象工厂接口,并在工厂方法中创建具体产品对象。在客户端代码中,我们通过实例化具体工厂类并调用工厂方法来创建具体产品对象,并调用产品对象的操作方法。
确保一个类只有一个实例,并提供全局访问点。
单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。单例模式的核心思想是通过一个私有的静态变量来保存类的实例,并提供一个公共的静态方法来获取这个实例,确保在程序运行期间只有一个实例被创建和使用。
单例模式主要用于以下情景:
单例模式包含以下几个核心角色:
单例模式的工作流程如下:
以下是一个简化的单例模式示例,展示了如何实现一个线程安全的单例类。
public class Singleton { // 私有静态变量,用于保存唯一实例 private static Singleton instance; // 私有构造函数,防止外部实例化类 private Singleton() {} // 公共静态方法,获取类的唯一实例 public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } // 其他方法 public void doSomething() { System.out.println("Singleton instance is doing something"); } }
客户端代码
public class Client {
public static void main(String[] args) {
// 获取单例实例
Singleton singleton = Singleton.getInstance();
singleton.doSomething();
}
}
在这个示例中,Singleton
是单例类,其中私有静态变量 instance
用于保存唯一实例。私有构造函数确保外部无法直接实例化类。公共静态方法 getInstance
提供了全局访问点来获取唯一实例,并通过加锁保证了线程安全。在客户端代码中,我们通过调用 getInstance
方法来获取单例实例,并调用其方法进行操作。
这类模式关注类和对象的组合,继承的概念被用来组合接口和定义组合对象获得新功能的方式。
记忆方法:代理员外适合乔装
持续更新中。。。关注我,一起进步~
为其他对象提供一种代理以控制对这个对象的访问。
通过共享技术来有效地支持大量细粒度的对象。
提供了一个统一的接口,用来访问子系统中的一群接口。
允许接口不兼容的对象能够相互合作。
将对象组合成树形结构以表示“部分-整体”的层次结构。
将抽象部分与实现部分分离,使它们都可以独立地变化。
动态地给对象添加一些额外的职责。
这类模式专注于对象之间的通信。
记忆方法:访问者观察备忘录状态,老板任命中介解释迭代器策略。
允许一个或多个操作应用到一组对象上,解耦操作和对象本身。
当一个对象状态发生改变时,所有依赖于它的对象都得到通知并自动更新。
在不破坏封装的前提下,捕获并保存一个对象的内部状态。
允许一个对象在其内部状态改变时改变它的行为。
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。
为请求创建了一个接收者对象的链。
将请求封装成对象,从而让你使用不同的请求、队列或日志请求,并支持可撤销的操作。
通过引入一个第三方对象(中介者)来控制两个对象(同事)之间的交互。
实现一个表达式接口,该接口解释一个特定的上下文。
提供一种方法顺序访问一个集合对象中的各个元素,而又不暴露其内部的表示。
定义一系列的算法,把它们一个个封装起来,并使它们可相互替换。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。