卡盟网站制作微信小程序开发平台
2026/2/11 5:02:15 网站建设 项目流程
卡盟网站制作,微信小程序开发平台,登封做网站优化,网站做担保交易1.关联链接 上一篇#xff1a;一个实例用全创建型模式-CSDN博客 目录#xff1a;《一个实例讲完23种设计模式》 2.内容 当前#xff1a;单件抽象工厂创建者工厂方法优化 需求#xff1a;坦克大战 创建两种坦克 坦克类型 射程 速度 b70 70米 时/70公里…1.关联链接上一篇一个实例用全创建型模式-CSDN博客目录《一个实例讲完23种设计模式》2.内容当前单件抽象工厂创建者工厂方法优化需求坦克大战创建两种坦克坦克类型 射程 速度b70 70米 时/70公里b50 50米 时/50公里设计说明1.抽象工厂承担了创建部件的任务2.创建者承担了讲部件组装的任务3.工厂方法类相当于创建者模式的导演但是他是并未给用户提供选择创建者的接口。而是通过自己的多态来实现加载不同的创建者。类图红色为优化的部分设计分析这个需求本质上就是对坦克描述有两维度级别功能是“跑”和“射击”另一个维度是功能参数50型号和70型号这两个维度的结果创建不同型号的坦克。工厂方法用于创建不同型号的坦克工厂方法因引入不同的创建者而可以创建不同的坦克创建者可以创建不同的坦克因引入不同的抽象工厂不同而创建的部件不同。创建者的两个创建步骤创建“跑”和创建“射击”对应抽象工厂的两个创建能力。考虑到复杂度这里没有事用享元模式其实可以把功能静态化比如一个具体的功能比如“跑”这个功能对象可以让他享元即无论多少个坦克使用的具体跑功能对象只有一个比如“跑”的功能无论有多少辆坦克跑的功能是共享的至于70和50两个型号的差别可以用一个参数承载。设计模式综合运用这个例子中就是将功能享元了。代码//-----基本功能部分------------------------- //功能类 class Function{ public String mOperation; public void exe(int type) { System.out.println(mOperationtype); } }; //功能类-射击 class ShotFun extends Function{ static ShotFun mFunction new ShotFun(); static ShotFun get() { return mFunction; } public ShotFun() { mOperation 射击; } } //功能类-跑 class RunFun extends Function{ static RunFun mFunction new RunFun(); static RunFun get() { return mFunction; } public RunFun() { mOperation 跑; } } //-- interface 接口设计部分 ---------------- //坦克 interface ITank{ void shot(); void run(); void setmShot(IOperation mShot); void setmRun(IOperation mRun); } //功能 interface IOperation{ void exe(); } //抽象工厂 interface IAbstractFactory{ IOperation createShot(); IOperation createRun(); } //创建者模式 interface IBuilder{ void createShout(ITank t); void createRun(ITank t); } //工厂方法 interface IFactory{ ITank createTank(); } //发射 abstract class Shot implements IOperation{ int type; public void exe() { ShotFun.get().exe(type); } } //跑 abstract class Run implements IOperation{ int type; public void exe() { RunFun.get().exe(type); } } //-----实现类----------------------------------------------- //跑-70 class Shot70 extends Shot{ public Shot70() { type 70; } } //跑-50 class Run70 extends Run{ public Run70() { type 70; } } //发射-70 class Shot50 extends Shot{ public Shot50() { type 50; } } //发射-50 class Run50 extends Run{ public Run50() { type 50; } } //坦克-基类 class Tank implements ITank{ IOperation mShot; IOperation mRun; public void setmShot(IOperation mShot) { this.mShot mShot; } public void setmRun(IOperation mRun) { this.mRun mRun; } public void shot() { mShot.exe(); } public void run() { mRun.exe(); } } //--------抽象工厂---------------------------------------------- //抽象工厂可以装机坦克的部件但因不同工厂创建的一系列部件型号不同 //抽象工程-实现-70 class AbstractFactory70 implements IAbstractFactory{ public IOperation createShot() { return new Shot70(); } public IOperation createRun() { return new Run70(); } } //抽象工程-实现-50 class AbstractFactory50 implements IAbstractFactory{ public IOperation createShot() { return new Shot50(); } public IOperation createRun() { return new Run50(); } } //-------创建者---------------- //创建者-基类 //用创建者完成坦克部件的创建跑和设计 //同样的创建步骤因使用不同型号的抽象工厂而使创建出的部件不同而组装成不同型号的坦克 abstract class Builder implements IBuilder{ IAbstractFactory mIAbstractFactory; public void createShout(ITank t) { t.setmShot(mIAbstractFactory.createShot()); } public void createRun(ITank t) { t.setmRun(mIAbstractFactory.createRun()); } } //创建者-70 class Builder70 extends Builder{ public Builder70() { mIAbstractFactory new AbstractFactory70(); } } //创建者-50 class Builder50 extends Builder{ public Builder50() { mIAbstractFactory new AbstractFactory50(); } } //-----工厂方法----------------------------------- //工厂方法-基类 //就是创建坦克因工厂不同创建的坦克就不同 //这里的不同时靠使用的创建者不同而不同 abstract class Factory implements IFactory{ IBuilder mBuilder; public ITank createTank() { ITank t new Tank(); mBuilder.createRun(t); mBuilder.createShout(t); return t; } } //工厂方法-70 class Factory70 extends Factory{ public Factory70() { mBuilder new Builder70(); } } //工厂方法-50 class Factory50 extends Factory{ public Factory50() { mBuilder new Builder50(); } } //--------主函数----------------- //主函数 public class Client { public static void main(String[] args) { System.out.println(hello worldff !); Factory70 f7 new Factory70(); ITank t f7.createTank(); t.shot(); t.run(); } }运行结果2.关联知识1.创建型模式设计模式中的创建型模式Creational Pattern是一类用于处理对象创建过程的设计模式。它们旨在以灵活和高效的方式创建对象将对象的创建过程与使用过程分离从而降低系统的耦合度提高代码的可维护性和可扩展性。以下是创建型模式的详细介绍一、创建型模式概述创建型模式主要关注如何创建对象它们通过封装对象的创建过程使得客户端代码无需关心对象的创建细节从而降低了系统的复杂度。根据《设计模式可复用面向对象软件的基础》一书创建型模式主要包括以下五种单例模式Singleton Pattern工厂方法模式Factory Method Pattern抽象工厂模式Abstract Factory Pattern建造者模式Builder Pattern原型模式Prototype Pattern二、创建型模式详解1. 单例模式Singleton Pattern定义确保一个类只有一个实例并提供一个全局访问点。特点节省内存资源避免创建多个相同的实例。便于全局访问和控制。应用场景配置管理器、资源管理器等需要全局唯一实例的场景。实现方式饿汉式静态初始化在类加载时就创建实例。懒汉式延迟初始化在第一次使用时创建实例。双重检查锁定Double-Checked Locking线程安全的懒汉式实现。静态内部类利用类加载机制实现线程安全的延迟初始化。枚举Enum利用枚举的特性和语法糖实现单例。示例代码以饿汉式为例public class Singleton { // 类加载时就创建实例 private static final Singleton instance new Singleton(); // 私有构造函数防止外部实例化 private Singleton() {} // 提供全局访问点 public static Singleton getInstance() { return instance; } }2. 工厂方法模式Factory Method Pattern定义定义一个用于创建对象的接口但由子类决定实例化哪一个类。特点延迟到子类决定实例化哪一个类。遵循开闭原则易于扩展。应用场景当具体类的实例化需要延迟到子类时如日志记录器、连接池等。实现方式定义一个抽象工厂类包含创建产品对象的抽象方法。子类实现抽象工厂类提供具体的产品对象。示例代码// 抽象工厂类 public abstract class Factory { public abstract Product createProduct(); } // 具体工厂类 public class ConcreteFactory extends Factory { Override public Product createProduct() { return new ConcreteProduct(); } } // 抽象产品类 public abstract class Product { public abstract void use(); } // 具体产品类 public class ConcreteProduct extends Product { Override public void use() { System.out.println(Using ConcreteProduct); } }3. 抽象工厂模式Abstract Factory Pattern定义提供一个接口用于创建一族相关或依赖对象而无需指定具体类。特点创建一族相关或依赖的对象。遵循开闭原则易于扩展。应用场景系统需要一组相关或依赖的产品对象时如UI组件的跨平台开发。实现方式定义一个抽象工厂类包含创建一组相关或依赖对象的抽象方法。具体工厂类实现抽象工厂类提供具体的产品对象。示例代码// 抽象工厂类 public abstract class AbstractFactory { public abstract Button createButton(); public abstract TextArea createTextArea(); } // 具体工厂类1Windows风格 public class WindowsFactory extends AbstractFactory { Override public Button createButton() { return new WindowsButton(); } Override public TextArea createTextArea() { return new WindowsTextArea(); } } // 具体工厂类2Mac风格 public class MacFactory extends AbstractFactory { Override public Button createButton() { return new MacButton(); } Override public TextArea createTextArea() { return new MacTextArea(); } } // 抽象产品类 public abstract class Button { public abstract void render(); } // 具体产品类Windows风格按钮 public class WindowsButton extends Button { Override public void render() { System.out.println(Rendering Windows Button); } } // 具体产品类Mac风格按钮 public class MacButton extends Button { Override public void render() { System.out.println(Rendering Mac Button); } } // 抽象产品类 public abstract class TextArea { public abstract void render(); } // 具体产品类Windows风格文本区域 public class WindowsTextArea extends TextArea { Override public void render() { System.out.println(Rendering Windows TextArea); } } // 具体产品类Mac风格文本区域 public class MacTextArea extends TextArea { Override public void render() { System.out.println(Rendering Mac TextArea); } }4. 建造者模式Builder Pattern定义将一个复杂对象的构建过程与其表示分离使得同样的构建过程可以创建不同的表示。特点逐步构建复杂对象。便于控制构建过程易于扩展。应用场景需要创建复杂对象且对象的创建过程独立于其组成部分时如创建复杂的文档对象。实现方式定义一个抽象建造者类包含创建复杂对象各个部分的抽象方法。具体建造者类实现抽象建造者类提供具体的产品对象。定义一个指挥者类负责调用建造者类的方法构建复杂对象。示例代码// 抽象建造者类 public abstract class Builder { public abstract void buildPartA(); public abstract void buildPartB(); public abstract Product getResult(); } // 具体建造者类 public class ConcreteBuilder extends Builder { private Product product new Product(); Override public void buildPartA() { product.add(PartA); } Override public void buildPartB() { product.add(PartB); } Override public Product getResult() { return product; } } // 产品类 public class Product { private ListString parts new ArrayList(); public void add(String part) { parts.add(part); } public void show() { for (String part : parts) { System.out.println(part); } } } // 指挥者类 public class Director { public void construct(Builder builder) { builder.buildPartA(); builder.buildPartB(); } }5. 原型模式Prototype Pattern定义通过复制现有实例来创建新对象。特点避免了重复初始化过程。便于创建大量相似对象。应用场景需要大量相似对象的场景如编辑器中的图形工具。实现方式实现一个克隆方法clone()用于复制现有对象。示例代码public class Prototype implements Cloneable { private String id; public Prototype(String id) { this.id id; } public String getId() { return id; } // 实现克隆方法 Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } public static void main(String[] args) { try { Prototype original new Prototype(1); Prototype copy (Prototype) original.clone(); System.out.println(Original ID: original.getId()); System.out.println(Copied ID: copy.getId()); } catch (CloneNotSupportedException e) { e.printStackTrace(); } } }三、创建型模式总结创建型模式通过将对象的创建过程与使用过程分离提高了代码的灵活性和可维护性。它们适用于不同的场景可以根据具体需求选择合适的设计模式。例如单例模式适用于需要全局唯一实例的场景工厂方法模式和抽象工厂模式适用于2.创建型模式的特点创建型模式的特点和适用场景对比说明创建型模式是一组处理对象创建的设计模式它们旨在以灵活和高效的方式创建对象将对象的创建与使用分离提高系统的灵活性和可扩展性。以下是五种主要的创建型模式的特点和适用场景对比说明模式名称特点适用场景单例模式Singleton1. 确保一个类只有一个实例并提供一个全局访问点。1. 需要确保一个类只有一个实例的场景如配置管理器、资源管理器等。2. 节省系统资源避免重复创建对象。2. 需要全局访问点的场景如全局状态管理器、全局配置对象等。3. 实现简单但需注意多线程环境下的安全性。3. 对象创建开销较大的场景避免重复初始化。工厂方法模式Factory Method1. 定义一个创建对象的接口由子类决定实例化哪一个类。1. 需要根据条件动态选择不同产品类的场景如日志记录器、连接池等。2. 延迟对象的创建到子类符合开闭原则。2. 需要创建不同类型的对象而客户端不需要知道具体实现类的场景。3. 提高了系统的灵活性和可扩展性。3. 需要在不修改客户端代码的情况下通过扩展子类支持新产品的场景。抽象工厂模式Abstract Factory1. 提供一个接口用于创建一族相关或依赖对象而无需指定具体类。1. 需要创建一组相互关联或相互依赖的对象如UI组件的跨平台开发。2. 隔离了具体类的生成使得客户并不需要知道什么被创建。2. 需要支持多种产品族并且希望这些产品族的创建能够被封装起来的场景。3. 增加或替换产品族比较方便支持开闭原则。3. 系统需要独立于具体产品的创建、组合和表示时。建造者模式Builder1. 将一个复杂对象的构建过程与其表示分离逐步构造对象。1. 需要创建复杂对象且对象的创建过程独立于其组成部分时如创建复杂的文档对象。2. 可以创建不同表示的对象实现产品的灵活创建。2. 需要构建过程允许对象有不同的表示时。3. 客户端不必知道产品内部组成的细节。3. 构建过程需要精细控制允许分步构建和组装对象。原型模式Prototype1. 通过复制现有实例来创建新对象避免重复初始化。1. 需要大量相似对象的场景如编辑器中的图形工具。2. 提高了对象的创建效率简化了创建过程。2. 创建对象的成本较高或对象初始化过程较复杂的场景。3. 支持对象的深拷贝和浅拷贝。3. 需要通过复制现有对象来创建新对象时。详细对比说明单例模式特点单例模式确保一个类只有一个实例并提供一个全局访问点。它常用于需要全局控制资源的场景如配置管理、日志记录、数据库连接等。适用场景当需要确保在整个应用程序中某个类只能存在一个实例时。当对象需要被共享的场合共享对象可以节省内存并加快对象访问速度。当某类需要频繁实例化而创建的对象又频繁被销毁时。工厂方法模式特点工厂方法模式定义一个创建对象的接口由子类决定实例化哪一个类。它将对象的创建过程延迟到子类符合开闭原则提高了系统的灵活性和可扩展性。适用场景当需要创建不同类型的对象而客户端不需要知道具体实现类的场景。当需要根据条件动态选择不同产品类的场景。当需要在不修改客户端代码的情况下通过扩展子类支持新产品的场景。抽象工厂模式特点抽象工厂模式提供一个接口用于创建一族相关或依赖对象而无需指定具体类。它隔离了具体类的生成使得客户并不需要知道什么被创建支持开闭原则。适用场景当需要创建一组相互关联或相互依赖的对象时。当需要支持多种产品族并且希望这些产品族的创建能够被封装起来的场景。当系统需要独立于具体产品的创建、组合和表示时。建造者模式特点建造者模式将一个复杂对象的构建过程与其表示分离逐步构造对象。它允许通过指定复杂对象的类型和内容逐步构造一个复杂对象客户端不必知道产品内部组成的细节。适用场景当需要创建复杂对象且对象的创建过程独立于其组成部分时。当构建过程需要精细控制允许分步构建和组装对象时。当需要创建不同表示的对象实现产品的灵活创建时。原型模式特点原型模式通过复制现有实例来创建新对象避免重复初始化。它提高了对象的创建效率简化了创建过程支持对象的深拷贝和浅拷贝。适用场景当需要大量相似对象的场景。当创建对象的成本较高或对象初始化过程较复杂的场景。当需要通过复制现有对象来创建新对象时。总结创建型模式通过封装对象的创建方式使得系统不依赖于具体的类实现了对象创建的抽象化和多样化。在选择使用哪种创建型模式时需要根据具体的需求和上下文考虑对象的创建过程、系统的灵活性和可扩展性等因素。3.创建型模式的特点以下是对创建型模式的特点和使用场景的对比说明使用表格形式展示创建型模式特点使用场景单例模式- 确保一个类只有一个实例并提供一个全局访问点。- 当需要确保在整个应用程序中某个类只能存在一个实例时例如配置管理器、连接池等。工厂方法模式- 定义一个创建对象的接口但由子类决定实例化哪一个类。工厂方法让类的实例化推迟到子类中进行。- 当需要一个类对象的创建逻辑但希望由子类来决定实例化哪一个类时例如日志记录器、连接池等。抽象工厂模式- 提供一个接口用于创建一系列相关或依赖对象的家族而不需要指定它们的具体类。- 当需要一个系列的相互依赖或相互关联的对象并且希望这些对象的创建能够被封装起来时例如UI组件的跨平台开发。建造者模式- 将复杂对象的构建和表示分离允许通过指定复杂对象的类型和内容逐步构造一个复杂对象。- 当需要创建一个包含多个组成部分的复杂对象并且希望这些组成部分可以独立变化时例如创建复杂的文档对象。原型模式- 通过复制现有的实例来创建新的实例而不是通过实例化一个类。- 当创建对象的成本很高或者希望使用一个对象作为原型来创建更多相似对象时例如编辑器中的图形工具。说明单例模式适用于需要全局唯一实例的场景如配置文件管理器、数据库连接池等。通过确保一个类只有一个实例可以节省系统资源并简化对共享资源的访问。工厂方法模式适用于需要延迟到子类决定实例化哪一个类的场景。通过定义一个创建对象的接口将对象的创建逻辑封装在子类中提高了系统的可扩展性和灵活性。抽象工厂模式适用于需要创建一系列相关或依赖对象的场景。通过提供一个接口来创建一组相关对象使得客户端不需要关心具体实现只需关心接口即可。建造者模式适用于需要构建复杂对象的场景。通过分离对象的构建过程和表示可以逐步构造一个复杂对象并允许在构建过程中改变对象的表示。原型模式适用于需要快速创建大量相似对象的场景。通过复制现有对象来创建新对象可以节省创建时间并提高对象的创建效率。这些创建型模式在软件开发中各有优势可以根据具体需求选择合适的设计模式来提高代码的可维护性、可扩展性和重用性。4.模式渊源分析一 模式分析表桥接6模式桥接模式和桥接模式衍生的模式都是应用非常广泛的模式我认为是学习的重点。模式名称桥接对象桥接数桥接属性桥接图形桥接迭代1装饰自己单个静态链表有2组合自己多个静态树图有3观察者观察者多个静态点没4职责链职责者单个静态链表有5策略策略者单个动态点没6状态状态者单个动态点没7解释器解释器多个静态图有概念解释桥接对象桥接的对象桥接数桥接关系发生桥接对象的数量桥接属性这个桥接使动态还是静态的比如状态模式中的状态桥接是不断的变化的而组合模式的桥接在桥接后就不会发生变化桥接的关系会固定下来所以是静态的。桥接图形桥接关系形成的最终图形装饰会形成一个装饰链。组合会形成一种图的结构。观察者因为桥接的是一个链表型的观察者会形成链表但是这个链表不是有桥接关系形成桥接关系只形成了一个点。桥接迭代指桥接关系是否发生迭代。二 中间件4模式通用意图承载关联隔离关联减少关联序号名称代理的连接各自特性1适配器类桥接是解决接口不匹配的问题有可能是一系列的接口2外观类桥接将内部公共函数代理对外部模块公开。消除外部模块的直接访问减少了外部模块和内部个模块的连接。如果在更大一层的空间考虑。这个外观也可以当做中介者。3代理类桥接这个外观的差别不大不过这个模式强调的不是减少关联而是一个保护层举个例子说这个层可能比外观更外一层对一些非亲近的模块执行一些访问接口的限制。这层的主要价值在于权限的控制。4中介者函数依赖该模块的主要价值体系在对内部依赖级别的关系消除。不紧密的几个类之间有调用关系或者几个类简单调用关系较少可以用一个中介者还承担这些相互的调用从而消除一些耦合使他们只和中介者发生耦合。他的特点与外观相比更大的 针对性在内部且他是对几个平行关系者的代理。而外观是一个模块公布初期的接口是对外提供。虽然从结构的本质上没发做绝对的区分。但是使用意图是不一样的。结构关系和价值是一样的。但这不重要举个例子吧如果AF,是A模块的外观复杂和BF和CF沟通那么在A BF,CF间他就相当于中介者。不饶了我想您应该理解了吧二 模式分析表其他模式名称模板迭代接口性能分类1迭代器有多专用5模式2模板有多专用5模式3命令有单专用5模式4备忘录多专用5模式5解释器单专用5模式6单件单创建型模式7抽象工厂有多创建型模式8工厂方法单创建型模式9创建者多创建型模式10原型单有创建型模式11享元单有创建型模式12访问者单双向依赖模式5.面向对象五关系深入分析五种关系一般化关系、关联关系、聚合关系、合成关系、依赖关系。一般化关系Generalization表示类与类之间的继承关系接口与接口之间的继承关系或类对接口的实现关系。关联关系Association是类与类之间的联接它使一个类知道另一个类的属性和方法。可以单向和双向。聚合关系Aggregation关联关系的一种是强关联关系。表示整体和个体之间的关系。合成关系Composition关联关系的一种。比聚合关系更强。要求整体对象负责部分对象的生命周期。依赖关系Dependency类与类之间的联接单向。表示一个类依赖于另一个类的定义。关系图为什么化这样是一个图呢因为我觉得这五种关系是升级的关系。也及是说如果是聚会关系了一定已经包含链接关系了如果已经是链接关系了那么不可能没有依赖关系定义关系调用关系后于自己创建生命周期相同先于自己创建依赖关系A(B b)链接关系A(B b)A{ b.fun()}聚会关系A(B b)A{ b.fun()}A{ B mbnull }合成关系A(B b)A{ b.fun()}A{ B mbnull }A{ B mbnew B() }继承关系A(B b)bsuperA{ b.fun()}b superA{ B mbnull }b superA{ B mbnew B() }b supersuper(B).fun()b super上面这表是从升级的角度对5种关系做了一下分析。我不多说的应该很容易理解。但是在分析这个的过程中我 有发现了一个问题A对B依赖的升级和生命周期的关系定义关系A先于B调用关系A先于B聚合关系A先于B组合关系AB继承关系B先于A有A对于B升级的依赖我们发现关系越高越靠得住。这也说明了为什么设计时候几乎不用刻意的消除“聚会关系”关系以上的关系呢。其实就从人与人之间的关系考虑也是的关系密切到一定的程度关系反而简单了。就这里聚合以上的关系我这里把他暂时定义为亲人的关系。在亲人这个关系内处理问题是相对简单的多密切都不会增加复杂度。而链接和依赖这不同因为可靠性降低了所以导致了很多不确定性。就社会而言整个社会的复杂度增加也是在这个层面上。那么这里我想是不是觉得事情是否复杂的不是耦合度而是可靠性这里暂时一想我还没有深入的考虑这个问题。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询