wordpress媒体库有错误,苏州关键词优化排名推广,财政局网站建设方案,网络推广的渠道和方式有哪些工厂设计模式
工厂设计模式是一种创建型设计模式#xff0c;它提供了一种在不指定具体类的情况下创建对象的接口。在工厂设计模式中#xff0c;我们定义一个创建对象的接口#xff0c;让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
工厂设计模式的目…
工厂设计模式
工厂设计模式是一种创建型设计模式它提供了一种在不指定具体类的情况下创建对象的接口。在工厂设计模式中我们定义一个创建对象的接口让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
工厂设计模式的目的是
封装对象创建的过程使得用户不需要了解对象的实现细节。扩展性良好如果需要添加新的对象只需添加一个新的子类即可。遵循“开闭原则”即对扩展开放对修改封闭。
在java中万物皆对象这些对象都需要创建如果创建的时候直接new该对象就会对该对象耦合严重假如我们要更换对象所有new对象的地方都需要修改一遍这显然违背了软件设计的开闭原则。如果我们使用工厂来生产对象我们就只和工厂打交道就可以了彻底和对象解耦如果要更换对象直接在工厂里更换该对象即可达到了与对象解耦的目的所以说工厂模式最大的优点就是解耦。
工厂模式的主要功能就是帮助我们实例化对象的之所以名字中包含工厂模式四个字是因为对象的实例化过程是通过工厂实现的是用工厂代替new操作的。
这样做可以封装对象的实例化细节尤其是对于实例化比较复杂或者对象的生命周期应该集中管理的情况。会给你系统带来更大的可扩展性和尽量少的修改量。
工厂模式有三种分别是简单工厂模式工厂方法模式抽象工厂模式。三种模式从前到后越来越抽象也更具有一般性。
简单工厂模式
简单工厂模式并不属于23种设计模式其更像是一种编程习惯。
简单工厂模式结构
简单工厂包含如下角色
抽象产品 定义了产品的规范描述了产品的主要特性和功能。具体产品 实现或者继承抽象产品的子类具体工厂 提供了创建产品的方法调用者通过该方法来获取产品。
列举实现
抽象产品类小米SU7
/*** author OldGj 2024/02/20* version v1.0* apiNote 小米SU7抽象类*/
public abstract class XiaoMiSU7 {public void run(){System.out.println(百公里加速2.8);}public void stop(){System.out.println(黄色刹车盘);}// 获取配置public abstract String getDisposition();}具体产品低配版小米SU7
/*** author OldGj 2024/02/20* version v1.0* apiNote 低配小米SU7*/
public class LowConfigurationSU7 extends XiaoMiSU7 {Overridepublic String getDisposition() {return 低配小米SU7;}
}
具体产品高配版小米SU7
/*** author OldGj 2024/02/20* version v1.0* apiNote 高配小米SU7*/
public class HighConfigurationSU7 extends XiaoMiSU7{Overridepublic String getDisposition() {return 高配小米SU7;}
}具体工厂类
/*** author OldGj 2024/02/20* version v1.0* apiNote 小米SU7静态工厂*/
public class SimpleSU7Factory {/*** 根据不同配置生产小米SU7 静态方法直接通过类名打点调用即可* param type 不同配置* return 不同配置的小米SU7*/public XiaoMiSU7 createXiaoMiSU7(String type) {XiaoMiSU7 xiaoMiSU7 null;if (high.equals(type)) {xiaoMiSU7 new HighConfigurationSU7();} else if (low.equals(type)) {xiaoMiSU7 new LowConfigurationSU7();}return xiaoMiSU7;}
}通过以上的简单工厂模式我们在小米4S店类中只需要使用SU7工厂类直接生产SU7即可不需要再将4S店类与高配版SU7以及低配版SU7类之间进行耦合达到了解耦的目的。
/*** author OldGj 2024/02/20* version v1.0* apiNote 小米4S店*/
public class MI4S {/*** 订购小米SU7* param type 订购类型高配低配* return 高配低配小米SU7*/public XiaoMiSU7 orderXiaoMiSU7(String type) {SimpleSU7Factory su7Factory new SimpleSU7Factory();XiaoMiSU7 xiaoMiSU7 su7Factory.createXiaoMiSU7(type);xiaoMiSU7.run();xiaoMiSU7.stop();return xiaoMiSU7;}
}优缺点
优点
封装了创建对象的过程可以通过参数直接获取对象。把对象的创建和业务逻辑层分开这样以后就避免了修改客户代码如果要实现新产品直接修改工厂类而不需要在原代码中修改这样就降低了客户代码修改的可能性更加容易扩展。
缺点
增加新产品时还是需要修改工厂类的代码违背了“开闭原则”。 扩展静态工厂模式 我们可以将工厂中的创建产品的方法设置为工厂类的静态方法这样我们在4S店中只需要通过工厂类名之间打点调用创建产品方法即可无序去实例化工厂对象。 /*** author OldGj 2024/02/20* version v1.0* apiNote 小米SU7静态工厂*/
public class SimpleSU7Factory {/*** 根据不同配置生产小米SU7 静态方法直接通过类名打点调用即可* param type 不同配置* return 不同配置的小米SU7*/public static XiaoMiSU7 createXiaoMiSU7(String type) {XiaoMiSU7 xiaoMiSU7 null;if (high.equals(type)) {xiaoMiSU7 new HighConfigurationSU7();} else if (low.equals(type)) {xiaoMiSU7 new LowConfigurationSU7();}return xiaoMiSU7;}
}通过以上优缺点分析我们发现简单工厂模式模式虽然把对象的创建和业务逻辑层分开但是如果我们想要进行拓展任然需要手动修改工厂方法中创建对象的逻辑这显然也是不符合‘开闭原则’的因此我们可以使用简单工厂模式配置文件的方式解决这一问题。
可以通过工厂模式配置文件的方式解除工厂对象和产品对象的耦合。在工厂类中加载配置文件中的全类名并创建对象进行存储客户端如果需要对象直接进行获取即可。
第一步定义配置文件
为了演示方便我们使用properties文件作为配置文件名称为bean.properties
americancom.tyut.pattern._01_creative_model.e02factor.config_factory.AmericanCoffee
lattecom.tyut.pattern._01_creative_model.e02factor.config_factory.LatteCoffee
kucom.tyut.pattern._01_creative_model.e02factor.config_factory.KuCoffee第二步改进工厂类
/*** author OldGj 2024/02/20* version v1.0* apiNote 简单咖啡工厂类 - 通过加载配置文件的方式实现开闭原则* 解除简单工厂类和具体产品类之间的耦合*/
public class CoffeeFactory {//定义一个map容器存储对象private static final MapString, Coffee map new HashMap();/** 在静态代码块中加载配置文件并创建对象*/static {InputStream resource CoffeeFactory.class.getClassLoader().getResourceAsStream(bean.properties);Properties properties new Properties();try {properties.load(resource);SetObject keySet properties.keySet();for (Object key : keySet) {String className properties.getProperty((String) key);// 通过类的全限定路径创建类的反射字节码对象Class? clazz Class.forName(className);// 通过反射对象调用类的无参构造实例化类Coffee coffee (Coffee) clazz.newInstance();map.put((String) key, coffee);}} catch (Exception e) {throw new RuntimeException(e);}}//创建对象public static Coffee createCoffee(String type) {return map.get(type);}
}静态成员变量用来存储创建的对象键存储的是名称值存储的是对应的对象而读取配置文件以及创建对象写在静态代码块中目的就是只需要执行一次。
通过以上代码改进工厂类我们就可以通过读取配置文件中的配置将需要的对象通过反射技术创建并加入容器中在creat方法中只需要通过参数获取容器中的对象并返回即可这样就可以实现工厂类与具体产品类之间解耦如果需要添加具体产品只需要创建新增产品类并且在配置文件中加入新增产品的全限定路径即可工厂类会在类加载阶段就将产品类创建并加入容器无序修改工厂类实现了“开闭原则”
工厂方法模式
概念
定义一个用于创建对象的接口让子类决定实例化哪个产品类对象。工厂方法使一个产品类的实例化延迟到其工厂的子类。
工厂方法模式结构
工厂方法模式的主要角色
抽象工厂Abstract Factory提供了创建产品的接口调用者通过它访问具体工厂的工厂方法来创建产品。具体工厂ConcreteFactory主要是实现抽象工厂中的抽象方法完成具体产品的创建。抽象产品Product定义了产品的规范描述了产品的主要特性和功能。具体产品ConcreteProduct实现了抽象产品角色所定义的接口由具体工厂来创建它同具体工厂之间一一对应。
列举实现
抽象产品 抽象产品类小米SU7
/*** author OldGj 2024/02/20* version v1.0* apiNote 小米SU7抽象类*/
public abstract class XiaoMiSU7 {public void run(){System.out.println(百公里加速2.8);}public void stop(){System.out.println(黄色刹车盘);}// 获取配置public abstract String getDisposition();}具体产品低配版小米SU7
/*** author OldGj 2024/02/20* version v1.0* apiNote 低配小米SU7*/
public class LowConfigurationSU7 extends XiaoMiSU7 {Overridepublic String getDisposition() {return 低配小米SU7;}
}
具体产品高配版小米SU7
/*** author OldGj 2024/02/20* version v1.0* apiNote 高配小米SU7*/
public class HighConfigurationSU7 extends XiaoMiSU7{Overridepublic String getDisposition() {return 高配小米SU7;}
}抽象工厂类
/*** author OldGj 2024/02/20* version v1.0* apiNote 抽象工厂*/
public interface XiaoMiSU7Factory {XiaoMiSU7 createXiaoMiSU7();}为每一个具体产品都创建一个与之对应的具体工厂用来创建具体产品实例。 具体工厂类低配版SU7工厂
/*** author OldGj 2024/02/20* version v1.0* apiNote 低配小米SU7工厂*/
public class LowXiaoMiSU7Factory implements XiaoMiSU7Factory {Overridepublic XiaoMiSU7 createXiaoMiSU7() {return new LowConfigurationSU7();}
}具体工厂类高配版SU7工厂
/*** author OldGj 2024/02/20* version v1.0* apiNote 高配小米SU7工厂*/
public class HighXiaoMiSU7Factory implements XiaoMiSU7Factory {Overridepublic XiaoMiSU7 createXiaoMiSU7() {return new HighConfigurationSU7();}
}小米4S店类
/*** author OldGj 2024/02/20* version v1.0* apiNote 小米4S店*/
public class MI4S {private XiaoMiSU7Factory factory;public void setFactory(XiaoMiSU7Factory factory) {this.factory factory;}/*** 订购小米SU7** return 小米SU7*/public XiaoMiSU7 orderXiaoMiSU7() {XiaoMiSU7 xiaoMiSU7 factory.createXiaoMiSU7();xiaoMiSU7.run();xiaoMiSU7.stop();return xiaoMiSU7;}
}工厂方法模式是简单工厂模式的进一步抽象。由于使用了多态性工厂方法模式保持了简单工厂模式的优点而且克服了它的缺点。
在小米4S店类中我们只需声明一个抽象工厂类型的成员变量并且调用其创建SU7方法即可具体创建什么类型的SU7并不需要我们关心只需要在客户端传入不同类型的工厂对象即可通过这种工厂方法模式我们将工厂类和具体产品类完全解耦一个工厂只负责生产一种具体产品并且如果我们还要拓展一个具体产品如中配版SU7我们只需创建新的具体产品类以及具体工厂类并让其实现其抽象即可无序修改工厂类代码符合“开闭原则”。
优缺点
优点
用户只需要知道具体工厂的名称就可得到所要的产品无须知道产品的具体创建过程在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类无须对原工厂进行任何修改满足开闭原则
缺点
每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类这增加了系统的复杂度。
抽象工厂模式
前面介绍的工厂方法模式中考虑的是一类产品的生产如畜牧场只养动物、电视机厂只生产电视机。
这些工厂只生产同种类产品同种类产品称为同等级产品也就是说工厂方法模式只考虑生产同等级的产品但是在现实生活中许多工厂是综合型的工厂能生产多等级种类 的产品如电器厂既生产电视机又生产洗衣机或空调大学既有软件专业又有生物专业等。
抽象工厂模式将考虑多等级产品的生产将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族。 产品族位于不同产品等级结构中功能相关的产品组成的家族。 概念
是一种为访问类提供一个创建一组相关或相互依赖对象的接口且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
抽象工厂模式是工厂方法模式的升级版本工厂方法模式只生产一个等级的产品而抽象工厂模式可生产多个等级的产品。
抽象工厂模式结构
抽象工厂模式的主要角色如下
抽象工厂Abstract Factory提供了创建产品的接口它包含多个创建产品的方法可以创建多个不同等级的产品。具体工厂Concrete Factory主要是实现抽象工厂中的多个抽象方法完成具体产品的创建。抽象产品Product定义了产品的规范描述了产品的主要特性和功能抽象工厂模式有多个抽象产品。具体产品ConcreteProduct实现了抽象产品角色所定义的接口由具体工厂来创建它同具体工厂之间是多对一的关系。
列举实现
抽象产品类咖啡类
/*** author OldGj 2024/02/20* version v1.0* apiNote 抽象产品 - 咖啡*/
public abstract class Coffee {public abstract String getName();public void addSugar(){System.out.println(加糖);}public void addMilk(){System.out.println(加奶);}}抽象产品类甜品类
/*** author OldGj 2024/02/20* version v1.0* apiNote 抽象产品 - 甜品*/
public abstract class Dessert {public abstract String getName();}咖啡类和甜品类同属于甜点产品族中不同等级的产品。 具体产品类
/*** author OldGj 2024/02/20* version v1.0* apiNote 具体产品 - 拿铁咖啡*/
public class LatteCoffee extends Coffee{Overridepublic String getName() {return 拿铁咖啡;}
}/*** author OldGj 2024/02/20* version v1.0* apiNote 具体产品 - 美式咖啡*/
public class AmericanCoffee extends Coffee {Overridepublic String getName() {return 美式咖啡;}
}/*** author OldGj 2024/02/20* version v1.0* apiNote 具体产品 - 抹茶慕斯*/
public class MatchaMousse extends Dessert{Overridepublic String getName() {return 抹茶慕斯;}
}/*** author OldGj 2024/02/20* version v1.0* apiNote 具体产品 - 提拉米苏*/
public class Tiramisu extends Dessert {Overridepublic String getName() {return 提拉米苏;}
}具体产品分别继承自各自产品等级的顶层抽象并实现其抽象方法。 抽象工厂类甜点产品族
/*** author OldGj 2024/02/20* version v1.0* apiNote 抽象工厂 - 甜点接口*/
public interface DessertFactory {Dessert createDessert();Coffee createCoffee();
}抽象工厂模式中一个抽象工厂类中提供了多个同一产品族产品的生产方法。 例如一个甜点类抽象工厂中提供了生产咖啡方法和生产甜品方法。 具体工厂类意大利风味甜点
/*** author OldGj 2024/02/20* version v1.0* apiNote 具体工厂 - 意大利风味甜点*/
public class ItalyDessertFactory implements DessertFactory {Overridepublic Dessert orderDessert() {return new Tiramisu();}Overridepublic Coffee orderCoffee() {return new LatteCoffee();}
}具体工厂类美式风味甜点
/*** author OldGj 2024/02/20* version v1.0* apiNote 具体工厂 - 美式风味甜点*/
public class AmericanDessertFactory implements DessertFactory {Overridepublic Dessert orderDessert() {return new MatchaMousse();}Overridepublic Coffee orderCoffee() {return new AmericanCoffee();}
}如果要加同一个产品族的话只需要再加一个对应的工厂类即可不需要修改其他的类。
优缺点
优点
当一个产品族中的多个对象被设计成一起工作时它能保证客户端始终只使用同一个产品族中的对象。
缺点
当产品族中需要增加一个新的产品时所有的工厂类都需要进行修改。
开闭原则的倾斜性 开闭原则”要求系统对拓展开放对修改关闭通过扩展达到增强其功能的目的。对于涉及到多个产品族与多个产品等级结构的系统其功能增强包括两方面 增加产品族对于增加新的产品族工厂方法模式很好的支持了“开闭原则”对于新增加的产品族只需要对应增加一个新的具体工厂即可对已有代码无序做任何修改。增加新的产品等级结构对于增加新的产品等级结构需要修改所有的工厂角色包括抽象工厂类在所有的工厂类中都需要增加生产新产品的方法不能很好的支持“开闭原则”。 抽象工厂模式的这种性质称为“开闭原则”的倾斜性抽象工厂模式以一种倾斜的方式支持增加新的产品它为新产品族的增加提供方便但不能为新的产品等级结构的增加提供方便。 抽象工厂模式总结
抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口而无须指定它们具体的类。抽象工厂模式又称为Kit模式属于对象创建型模式。
抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态。
抽象工厂模式的主要优点是隔离了具体类的生成使得客户并不需要知道什么被创建而且每次可以通过具体工厂类创建一个产品族中的多个对象增加或者替换产品族比较方便增加新的具体工厂和产品族很方便主要缺点在于增加新的产品等级结构很复杂需要修改抽象工厂和所有的具体工厂类对“开闭原则”的支持呈现倾性。
使用场景 当需要创建的对象是一系列相互关联或相互依赖的产品族时如电器工厂中的电视机、洗衣机、空调等。 系统中有多个产品族但每次只使用其中的某一族产品。如有人只喜欢穿某一个品牌的衣服和鞋。 系统中提供了产品的类库且所有产品的接口相同客户端不依赖产品实例的创建细节和内部结构。
JDK中的工厂模式 Collection.iterator方法 Collection接口是抽象工厂类 ArrayList是具体的工厂类 Iterator接口是抽象商品类 ArrayList类中的Itr内部类是具体的商品类。 在具体的工厂类中iterator()方法创建具体的商品类的对象。 DateForamt类中的getInstance()方法使用的是工厂模式,Calendar类中的getInstance()方法使用的是工厂模式