网站建设的意见,wordpress在线教育主题,あかねさす少女免费,网络公司官网小谈设计模式#xff08;9#xff09;—工厂方法模式 专栏介绍专栏地址专栏介绍 工厂方法模式角色分类抽象产品#xff08;Abstract Product#xff09;具体产品#xff08;Concrete Product#xff09;抽象工厂#xff08;Abstract Factory#xff09;具体工厂#x… 小谈设计模式9—工厂方法模式 专栏介绍专栏地址专栏介绍 工厂方法模式角色分类抽象产品Abstract Product具体产品Concrete Product抽象工厂Abstract Factory具体工厂Concrete Factory 核心思想Java代码实现假设有一个汽车工厂可以生产不同类型的汽车包括小轿车和SUV。首先定义一个抽象汽车类AbstractProduct然后定义具体的小轿车类ConcreteProduct1和SUV类ConcreteProduct2它们都继承自抽象汽车类接下来定义抽象汽车工厂类AbstractFactory其中包含一个创建汽车的抽象方法然后定义具体的小轿车工厂类ConcreteFactory1和SUV工厂类ConcreteFactory2它们都继承自抽象汽车工厂类最后在客户端代码中使用工厂方法来创建汽车对象输出结果为分析 优缺点分析优点符合开闭原则封装了对象的创建过程降低了客户端和具体产品的耦合可以通过配置文件等方式动态指定具体工厂类 缺点增加了系统的复杂度增加了代码的数量客户端需要知道具体工厂类 专栏介绍
专栏地址
link
专栏介绍
主要对目前市面上常见的23种设计模式进行逐一分析和总结希望有兴趣的小伙伴们可以看一下会持续更新的。希望各位可以监督我我们一起学习进步加油各位。
工厂方法模式
工厂方法模式是一种创建型设计模式它定义了一个创建对象的接口但由子类决定要实例化的类是哪一个。工厂方法模式将对象的实例化推迟到子类中进行。
角色分类
抽象产品Abstract Product
定义了产品的接口是具体产品类的共同父类或接口。
具体产品Concrete Product
实现了抽象产品接口的具体类。
抽象工厂Abstract Factory
定义了创建产品的接口包含一个或多个创建产品的抽象方法。
具体工厂Concrete Factory
实现了抽象工厂接口负责实例化具体产品。
核心思想
将对象的创建与使用分离客户端通过调用工厂方法来创建对象而不是直接实例化具体产品。这样做的好处是客户端只需要知道抽象产品和抽象工厂的存在而无需关心具体产品的细节。当需要创建不同类型的产品时只需要实现对应的具体产品和具体工厂即可而不需要修改客户端的代码。 Java代码实现
假设有一个汽车工厂可以生产不同类型的汽车包括小轿车和SUV。首先定义一个抽象汽车类AbstractProduct
public abstract class Car {public abstract void drive();
}然后定义具体的小轿车类ConcreteProduct1和SUV类ConcreteProduct2它们都继承自抽象汽车类
public class SedanCar extends Car {Overridepublic void drive() {System.out.println(Driving sedan car...);}
}public class SUV extends Car {Overridepublic void drive() {System.out.println(Driving SUV...);}
}接下来定义抽象汽车工厂类AbstractFactory其中包含一个创建汽车的抽象方法
public abstract class CarFactory {public abstract Car createCar();
}然后定义具体的小轿车工厂类ConcreteFactory1和SUV工厂类ConcreteFactory2它们都继承自抽象汽车工厂类
public class SedanCarFactory extends CarFactory {Overridepublic Car createCar() {return new SedanCar();}
}public class SUVFactory extends CarFactory {Overridepublic Car createCar() {return new SUV();}
}最后在客户端代码中使用工厂方法来创建汽车对象
public class Client {public static void main(String[] args) {CarFactory factory1 new SedanCarFactory();Car sedanCar factory1.createCar();sedanCar.drive();CarFactory factory2 new SUVFactory();Car suv factory2.createCar();suv.drive();}
}输出结果为
Driving sedan car...
Driving SUV...分析
通过工厂方法模式客户端代码只需要与抽象产品和抽象工厂进行交互而无需关心具体产品的创建过程。当需要新增其他类型的汽车时只需要实现对应的具体产品和具体工厂即可而不需要修改客户端的代码实现了代码的可扩展性和可维护性。
优缺点分析
优点
符合开闭原则
工厂方法模式通过引入抽象工厂和具体工厂的概念使得系统的扩展性更好。当需要新增一种产品时只需要新增对应的具体产品和具体工厂而不需要修改已有的代码符合开闭原则。
封装了对象的创建过程
客户端只需要关心抽象产品和抽象工厂而无需关心具体产品的创建过程。具体产品的创建过程被封装在具体工厂中使得客户端代码更加简洁、可读性更高。
降低了客户端和具体产品的耦合
客户端只依赖于抽象产品和抽象工厂而不依赖于具体产品。这样可以使客户端代码与具体产品解耦提高代码的灵活性和可维护性。
可以通过配置文件等方式动态指定具体工厂类
工厂方法模式可以通过配置文件、反射等方式动态指定具体工厂类从而实现更加灵活的对象创建方式。
缺点
增加了系统的复杂度
引入抽象工厂和具体工厂的概念使得系统的结构变得更加复杂。如果系统中只有少量的产品使用工厂方法模式可能会显得过于复杂不利于维护和理解。
增加了代码的数量
工厂方法模式需要定义抽象产品、具体产品、抽象工厂、具体工厂等多个类这增加了代码的数量。对于简单的项目使用工厂方法模式可能会显得冗余。
客户端需要知道具体工厂类
客户端需要知道具体工厂类的存在这增加了客户端的依赖。如果具体工厂类的创建逻辑发生变化客户端代码也需要相应的修改。