简单工厂模式

合集下载

Python中的工厂模式

Python中的工厂模式

Python中的工厂模式工厂模式(Factory Pattern)是一种常用的设计模式,用于创建对象。

它属于创建型模式,通过定义一个工厂类负责创建其他对象的实例,而不必直接使用new关键字来创建对象。

工厂模式使得代码的可拓展性和复用性更好,同时也隐藏了对象的创建和实现细节,简化了客户端的操作。

工厂模式的核心思想是将对象的实例化操作封装起来,让客户端只需调用工厂方法即可创建所需的对象。

从而达到降低系统耦合度的目的。

工厂模式的实现方式有两种:一种是通过一个单独的工厂类来创建所需的对象,另一种是通过将工厂方法定义在需要创建对象的类中。

其中,单独的工厂类又可以分为简单工厂和工厂方法两种模式。

1.简单工厂模式简单工厂模式(Simple Factory Pattern),也叫静态工厂模式,由一个工厂类负责创建所有需要的产品类的实例。

客户端只需向该工厂类传递相应的参数,即可获取所需的对象。

该模式下,工厂类通常是一个静态类或者包含一个静态方法的类。

简单工厂模式的代码结构如下:```class Product:def __init__(self):passclass ProductA(Product):def __init__(self):print("Product A")class ProductB(Product):def __init__(self):print("Product B")class SimpleFactory:def create_product(self, product_type):if product_type == "A":return ProductA()elif product_type == "B":return ProductB()factory = SimpleFactory()productA = factory.create_product("A")productB = factory.create_product("B")```该代码中,类Product、ProductA、ProductB分别为抽象产品类、具体产品类。

03 C#设计模式-简单工厂模式

03 C#设计模式-简单工厂模式

简单工厂模式的结构与实现
class Factory 简单工厂模式实现 { //静态工厂方法 典型的工厂类代码: public static Product GetProduct(string arg) { Product product = null; if (arg.Equals("A")) { product = new ConcreteProductA(); //初始化设置product } else if (arg.Equals("B")) { product = new ConcreteProductB(); //初始化设置product } return product; } }

简单工厂模式概述
简单工厂模式定义
在简单工厂模式中用于创建实例的方法通常是静态 (static)方法,因此又被称为静态工厂方法(Static Factory Method)模式 要点:如果需要什么,只需要传入一个正确的参数, 就可以获取所需要的对象,而无须知道其创建细节
<<use>>
udao.FindUserById();
引入工厂类UserDAOFactory
UserDAOFactory + CreateUserDAO (int arg) : UserDAO ...
Login - udao : UserDAO + Login (int arg) + Execute () : void ...

创建对象与使用对象
C#语言创建对象的几种方式
使用new关键字直接创建对象 通过反射机制创建对象 通过克隆方法创建对象 通过工厂类创建对象
www.CBiblioteka

简单工厂模式、工厂模式和抽象工厂模式区别及优缺点

简单工厂模式、工厂模式和抽象工厂模式区别及优缺点

简单⼯⼚模式、⼯⼚模式和抽象⼯⼚模式区别及优缺点各位⼩伙伴好,今天给⼤家主要介绍⼀下简单⼯⼚模式、⼯⼚模式和抽象⼯⼚模式的区别及各⾃的优缺点。

(本⽂实现语⾔为Python3)【前⾔】众所周知今天所讲的内容是设计模式的⼀类;对于设计模式这个概念,我想⾸先请⼤家问问⾃⼰:1、什么是设计模式 2、我们为什么要了解并学习设计模式?从我上学的时候我相信⼤家跟我⼀样也接触过设计模式的课程,当时可能懵懵懂懂只是知其然,当时还会想明明可以直接写出来为什么要搞成这样的形式,我就算学会了它到底什么时候能⽤呢?⼀系列的问题...Emm算了到时候再想想(lazy)。

随着实践的不断增多,现在我想可以对这些问题有个初步的回答了: 1、在我看来,设计模式外在看是经过前⼈不断实践总结出的针对某些指定场景极其好⽤的⼀种代码结构设计模板;内在看其实是⼀种设计思想(即为什么他们会这么想,这样想较之其他⽅法有什么好处)。

当我们真正的理解设计思想的时候,就可能会在⾯对问题和场景时⾃然⽽然的灵活运⽤到多种设计模式,⽽不是单⼀的刻板结构。

2、在⼯程化的开发中,需求往往是会不断变化的,这也是让很多开发⼈员及其烦躁的地⽅,所以才会有开发与产品的亲密关系。

设计模式就是为了抵御外部需求变化产⽣的。

设计模式应符合开闭原则(类、模块和函数等应该对扩展开放,对修改关闭。

)⼀个好的设计在之后的开发中,包括发⽣重⼤需求变化的时候,往往代码只需要进⾏简单重构去进⾏适配,⽽不是通过打补丁的⽅式去堆砌,也很容易避免破窗效应,充分的发挥了灵活的扩展和适配,⼤⼤增强了维护性。

综上所述,我们了解并学习设计模式,可以使我们的代码变得更加健壮、结构清晰,可以从容、灵活的适配需求变更(可复⽤、可扩展、可维护、够灵活)【正⽂】⾸先,这三种模式解决的问题是实例化对象的问题;那么为什么不直接实例化⽽⽤这样的⼯⼚形式去实例化对象呢?因为【待实例化对象太多(⼦类多且变动、调⽤频繁)或者实例化对象的过程、准备⽐较复杂】,直接实例化意味着每次都⽤重复的去执⾏实例化这个操作,如果有很多待实例化的操作,那么就要重复执⾏很多次,更不要说万⼀在实例化之前还要执⾏⼀堆配置项的初始化。

软件设计——简单工厂模式之女娲造人

软件设计——简单工厂模式之女娲造人

软件设计——简单⼯⼚模式之⼥娲造⼈⼀、简单⼯⼚模式含义简单⼯⼚模式⼜叫静态⽅法模式(因为⼯⼚类定义了⼀个静态⽅法)现实⽣活中,⼯⼚是负责⽣产产品的;同样在设计模式中,简单⼯⼚模式我们可以理解为负责⽣产对象的⼀个类,称为“⼯⼚类”⼆、解决的问题将“类实例化的操作”与“使⽤对象的操作”分开,让使⽤者不⽤知道具体参数就可以实例化出所需要的“产品”类,从⽽避免了在客户端代码中显式指定,实现了解耦。

即使⽤者可直接消费产品⽽不需要知道其⽣产的细节三、模式原理3.1 模式组成3.2 UML类图3.3 使⽤步骤创建抽象产品类 & 定义具体产品的公共接⼝;创建具体产品类(继承抽象产品类) & 定义⽣产的具体产品;创建⼯⼚类,通过创建静态⽅法根据传⼊不同参数从⽽创建不同具体产品类的实例;外界通过调⽤⼯⼚类的静态⽅法,传⼊不同参数从⽽创建不同具体产品类的实例四、具体实例[实验任务⼀]:⼥娲造⼈实验要求:使⽤简单⼯⼚模式模拟⼥娲(Nvwa)造⼈(Person),如果传⼊参数M,则返回⼀个Man对象,如果传⼊参数W,则返回⼀个Woman对象,如果传⼊参数R,则返回⼀个Robot对象。

请⽤程序设计实现上述场景。

4.1 UML类图接⼝和类的区别:从定义上看,接⼝是个集合,并不是类。

类描述了属性和⽅法,⽽接⼝只包含⽅法(未实现的⽅法)。

接⼝和抽象类⼀样不能被实例化,因为不是类。

但是接⼝可以被实现(使⽤implements 关键字)。

4.2 代码Person . javapackage test2;public interface Person {public void make();}创建接⼝:File ---------> new --------> interfaceMan . javapackage test2;public class Man implements Person{public Man() {}public void make(){System.out.print("⽣产男⼈");}}Woman . javapackage test2;public class Woman implements Person{ public Woman() {}public void make() {System.out.print("⽣产⼥⼈");}}Robot . javapackage test2;public class Robot implements Person{public Robot() {}public void make(){System.out.print("⽣产机器⼈");}}Nvwa . javapackage test2;public class Nvwa {public Nvwa() {}public static Person Personjudge(String arg ) { //判断参数,再选择调⽤哪个类if(arg.equalsIgnoreCase("M")){return new Man();}else if(arg.equalsIgnoreCase("W")){return new Woman();}else if(arg.equalsIgnoreCase("R")){return new Robot();}else{return null;}}}test . javapackage test2;import java.util.Scanner;public class test {public static void main(String[] args) {// TODO Auto-generated method stubScanner scan = new Scanner(System.in);System.out.print("请输⼊参数:");String s = scan.nextLine();try{Person p = Nvwa.Personjudge(s);p.make();}catch(Exception e){System.out.println(e.getMessage());}scan.close();}}4.3 运⾏截图。

工厂模式的实现方式

工厂模式的实现方式

工厂模式的实现方式
工厂模式有以下几种实现方式:
1. 简单工厂模式:由一个工厂类负责创建对象,根据传入的参数不同,工厂类可以创建不同的对象。

这种方式对于创建简单的对象较为适用,但是如果需要创建复杂的对象或者对象之间存在复杂的依赖关系,则不太适用。

2. 工厂方法模式:定义一个创建对象的工厂接口,由具体的工厂类来实现这个接口,每个具体工厂类负责创建一种具体的对象。

这种方式可以避免简单工厂模式中的一个类负责创建所有对象的问题,而且可以方便地扩展创建新的对象。

3. 抽象工厂模式:定义一个抽象工厂接口,具体的工厂类实现这个接口并负责创建一组相关的对象。

这种方式可以创建一组相关的对象,而不仅仅是单个对象。

这三种实现方式都可以用来创建对象,具体选择哪一种方式取决于具体的需求和设计。

简单工程模式

简单工程模式

简单工厂模式简单工厂模式解释:简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

简单工厂模式的UML图:简单工厂模式中包含的角色及其相应的职责如下:工厂角色(Creator):这是简单工厂模式的核心,由它负责创建所有的类的内部逻辑。

当然工厂类必须能够被外界调用,创建所需要的产品对象。

抽象(Product)产品角色:简单工厂模式所创建的所有对象的父类,注意,这里的父类可以是接口也可以是抽象类,它负责描述所有实例所共有的公共接口。

具体产品(Concrete Product)角色:简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类。

简单工厂模式深入分析:简单工厂模式解决的问题是如何去实例化一个合适的对象。

简单工厂模式的核心思想就是:有一个专门的类来负责创建实例的过程。

具体来说,把产品看着是一系列的类的集合,这些类是由某个抽象类或者接口派生出来的一个对象树。

而工厂类用来产生一个合适的对象来满足客户的要求。

如果简单工厂模式所涉及到的具体产品之间没有共同的逻辑,那么我们就可以使用接口来扮演抽象产品的角色;如果具体产品之间有功能的逻辑或,我们就必须把这些共同的东西提取出来,放在一个抽象类中,然后让具体产品继承抽象类。

为实现更好复用的目的,共同的东西总是应该抽象出来的。

在实际的的使用中,抽闲产品和具体产品之间往往是多层次的产品结构,如下图所示:简单工厂模式使用场景分析及代码实现:GG请自己的女朋友和众多美女吃饭,但是GG自己是不会做饭的或者做的饭很不好,这说明GG不用自己去创建各种食物的对象;各个美女都有各自的爱好,到麦当劳后她们喜欢吃什么直接去点就行了,麦当劳就是生产各种食物的工厂,这时候GG不用自己动手,也可以请这么多美女吃饭,所要做的就是买单O(∩_∩)O哈哈~,其UML图如下所示:实现代码如下:现在建立一个食物加工工厂:输出的结果如下:缺点:由于工厂类集中了所有实例的创建逻辑,这就直接导致一旦这个工厂出了问题,所有的客户端都会受到牵连;而且由于简单工厂模式的产品室基于一个共同的抽象类或者接口,这样一来,但产品的种类增加的时候,即有不同的产品接口或者抽象类的时候,工厂类就需要判断何时创建何种种类的产品,这就和创建何种种类产品的产品相互混淆在了一起,违背了单一职责,导致系统丧失灵活性和可维护性。

工厂业务逻辑

工厂业务逻辑

工厂业务逻辑
工厂模式是一种设计模式,它在软件开发中的“业务逻辑”主要体现在对象创建的过程中。

在复杂的系统中,通常会有多个类可以实现同一接口或者继承自同一个抽象类,具体使用哪个类来实例化对象需要根据运行时的条件决定。

这时,我们可以定义一个工厂类(或方法)来封装这个创建过程,隐藏了创建逻辑的复杂性,并使得代码更加灵活、易于扩展和维护。

以工厂业务逻辑为例:
1. 简单工厂模式:
- 定义一个工厂类,提供一个静态方法(或实例方法),接收参数并根据参数返回不同的产品实例。

- 例如,有一个`AnimalFactory`,通过传入字符串类型参数如"dog"或"cat",返回对应的`Dog`或`Cat`对象实例。

2. 工厂方法模式:
- 定义一个抽象工厂类,其中声明一个创建产品的抽象方法,由其子类来实现具体的创建逻辑。

- 如有`AnimalFactory`抽象类,其中包含`createAnimal()`抽象方法,然后分别创建`DogFactory`和`CatFactory`子类,它们各自重写`createAnimal()`方法,返回相应的`Dog`或`Cat`对象实例。

3. 抽象工厂模式:
- 提供一个接口用于创建相关或依赖对象家族的多个对象,而无需指定具体的产品类。

- 假设存在不同类型的动物及其对应的食物,可以创建一个`PetFactory`抽象工厂,它能生产出某一特定种类的宠物及其专属食物。

工厂模式的业务逻辑就是围绕如何根据需求动态选择和创建合适对象来进行组织和设计,从而降低耦合度,提高代码的灵活性和可扩展性。

简单工厂工厂方法抽象工厂策略模式策略与工厂的区别

简单工厂工厂方法抽象工厂策略模式策略与工厂的区别

简单工厂工厂方法抽象工厂策略模式策略与工厂的区别简单工厂、工厂方法、抽象工厂以及策略模式在软件开发中都是常用的设计模式,它们都是为了解决不同对象的创建和使用问题。

下面将对它们进行详细的介绍,并比较它们之间的区别。

1. 简单工厂模式(Simple Factory Pattern):简单工厂模式是由一个工厂类根据传入的参数决定创建哪种产品的设计模式。

它包含三个角色:工厂类负责创建产品,产品类定义产品的具体实现,客户端通过工厂类获取产品对象。

简单工厂模式将对象的创建与使用进行了分离,增加了灵活性,但是违反了开闭原则,因为每次新增产品都需要修改工厂类。

2. 工厂方法模式(Factory Method Pattern):工厂方法模式是指定义一个创建产品对象的接口,但是由子类决定实例化哪个类。

这样可以将产品的实例化延迟到子类中进行,满足了开闭原则。

工厂方法模式由抽象工厂类、具体工厂类和抽象产品类、具体产品类组成。

具体工厂类负责创建具体产品类的实例,抽象产品类定义了产品的接口。

客户端通过抽象工厂类获取产品对象。

工厂方法模式解决了简单工厂模式的缺点,但是增加了类的个数。

3. 抽象工厂模式(Abstract Factory Pattern):抽象工厂模式是指提供一个创建一系列相关或互相依赖对象的接口,而无需指定具体的类。

抽象工厂模式由抽象工厂类、具体工厂类和抽象产品类、具体产品类组成。

抽象工厂类定义了创建产品的接口,具体工厂类负责创建具体产品。

抽象产品类定义了产品的接口,具体产品类实现了产品的具体实现。

客户端通过抽象工厂类获取产品对象。

抽象工厂模式提供了一种创建一系列产品对象的方法,但是增加新产品时需要修改所有的工厂类。

4. 策略模式(Strategy Pattern):策略模式是指定义了一系列的算法,并将每个算法封装起来,使得它们可以互相替换,使得算法的选择和使用可以独立于客户端。

策略模式由抽象策略类、具体策略类和环境类组成。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
抽象产品类:将具体产品类公共的代码进行抽象和提取后封装在 } else if(arg.Equals("B")) 一个抽象产品类中
工厂类:提供一个工厂类用于创建各种产品,在工厂类中提供一 return new ConcreteProductB(); } 个创建产品的工厂方法,该方法可以根据所传入参数的不同创建 else 不同的具体产品对象 {
+ HistogramChart () + Display () : void ...
PieChart + PieChart () + Display () : void ...
<<create>>
<<create>>
图表库结构图
简单工厂模式
模式实例与解析
实例一:简单电视机工厂
• 某电视机厂专为各知名电视机品牌代工生产各类电视机,当需 要海尔牌电视机时只需要在调用该工厂的工厂方法时传入参数 “Haier”,需要海信电视机时只需要传入参数“Hisense”,工 厂可以根据传入的不同参数返回不同品牌的电视机。现使用简 单工厂模式来模拟该电视机工厂的生产过程。
RectangleFactory Rectangle 构造函数的名字都与类名相同,从构造函数和参数列表中 <<create>> + CreateRectangle (int width, int height) : Rectangle + Rectangle (int width, int height) 将对象 大家很难了解不同构造函数所构造的产品的差异 + CreateSquare (int width) : Rectangle + Rectangle (int width) ... ... 的创建过程封装在工厂类中,可以提供一系列名字完全不 同的工厂方法,每一个工厂方法对应一个构造函数,客户 端可以以一种更加可读、易懂的方式来创建对象
★★★★☆
★★★★★
★★★★☆
★★☆☆☆
★★★☆☆
★★★☆☆
★☆☆☆☆
★★★★☆
简单工厂模式概述
客户端 工厂 产品
参数
简单工厂模式示意图
简单工厂模式概述
具体产品类:将需要创建的各种不同产品对象的相关代码封装到 if(arg.Equals("A")) 具体产品类中 {
简单工厂模式基本实现流程 oductB
简单工厂模式的结构与实现
简单工厂模式的实现
典型的客户端代码:
class Program { static void Main(string[] args) { Product product; product = Factory.GetProduct("A"); //通过工厂类创建产品对象 product.MethodSame(); product.MethodDiff(); } }
创建型模式对类的实例化过程进行了抽象,能够将软 件模块中对象的创建和对象的使用分离,对用户隐藏 了类的实例的创建细节 创建型模式描述如何将对象的创建和使用分离,让用 户在使用对象时无须关心对象的创建细节,从而降低 系统的耦合度,让设计方案更易于修改和扩展
创建型模式
创建型模式关注点
创建什么(What) 由谁创建(Who) 何时创建(When) 使 用 对 象 创 建 对 象
Design Patterns
简单工厂模式
河南理工大学
大纲
创建型模式
简单工厂模式概述 简单工厂模式的结构与实现 简单工厂模式的应用实例 创建对象与使用对象 简单工厂模式的简化 简单工厂模式的优缺点与适用环境
创建型模式
创建型模式(Creational Pattern)关注对象的创建过 程
简单工厂模式概述
简单工厂模式的定义
在简单工厂模式中用于创建实例的方法通常是静态 (static)方法,因此又被称为静态工厂方法(Static Factory Method)模式 要点:如果需要什么,只需要传入一个正确的参数, 就可以获取所需要的对象,而无须知道其创建细节
简单工厂模式的结构与实现
<<create>>
<<create>>
if (arg == 0) { return new OracleUserDAO(); } else { return new SQLServerUserDAO(); }
创建对象与使用对象
实例分析
引入工厂类UserDAOFactory
• 如果UserDAO的某个子类的构造函数发生改变或者需要添加或 移除不同的子类,只要维护UserDAOFactory的代码,不会影 响到Login • 如果UserDAO的接口发生改变,例如添加、移除方法或改变方 法名,只需要修改Login,不会给UserDAOFactory带来任何影 响
简单工厂模式的应用实例
Chart
实例类图
HistogramChart
+ Display () : void ...
ChartFactory + GetChart (string type) : Chart ...
<<create>>
LineChart + LineChart () + Display () : void ...
简单工厂模式的结构与实现
简单工厂模式的实现
典型的具体产品类代码:
class ConcreteProductA : Product { //实现业务方法 public override void MethodDiff() { //业务方法的实现 } }
简单工厂模式的结构与实现
class Factory 简单工厂模式的实现 { //静态工厂方法 典型的工厂类代码: public static Product GetProduct(string arg) { Product product = null; if (arg.Equals("A")) { product = new ConcreteProductA(); //初始化设置product } else if (arg.Equals("B")) { product = new ConcreteProductB(); //初始化设置product } return product; } }
简单工厂模式的结构与实现
简单工厂模式的实现
典型的抽象产品类代码:
abstract class Product { //所有产品类的公共业务方法 public void MethodSame() { //公共方法的实现 } //声明抽象业务方法 public abstract void MethodDiff(); }
简单工厂模式
模式实例与解析
实例二:权限管理
创建对象与使用对象
实例分析 class Login
若改为SQLServerUserDAO必 {使用new 关键字创建对象 private UserDAO udao; 须修改源代码,违背开闭原则
public Login() { udao = new OracleUserDAO(); //创建对象 } public void Execute() { //其他代码 udao.FindUserById(); //使用对象 //其他代码 }
创建正方形对象 创建长方形对象
创建对象与使用对象
何时不需要工厂?
无须为系统中的每一个类都配备一个工厂类 如果一个类很简单,而且不存在太多变化,其构造过 程也很简单,此时就无须为其提供工厂类,直接在使 用之前实例化即可 否则会导致工厂泛滥,增加系统的复杂度 例如:string类
简单工厂模式
实例一:简单电视机工厂
简单工厂模式
模式实例与解析
实例二:权限管理
• 在某OA系统中,系统根据对比用户在登录时输入的账号和密 码以及在数据库中存储的账号和密码是否一致来进行身份验 证,如果验证通过,则取出存储在数据库中的用户权限等级 (以整数形式存储),根据不同的权限等级创建不同等级的 用户对象,不同等级的用户对象拥有不同的操作权限。现使 用简单工厂模式来设计该权限管理模块。
两个类A和B之间的关系应该仅仅是A创建B或者是A使用B,而 不能两种关系都有。将对象的创建和使用分离,使得系统更 加符合单一职责原则,有利于对功能的复用和系统的维护。
创建对象与使用对象
将对象的创建与使用分离的其他好处
防止用来实例化一个类的数据和代码在多个类中到处都是, 可以将有关创建的知识搬移到一个工厂类中,解决代码重 复、创建蔓延的问题
UserDAO + FindUserById () : void ...
udao = UserDAOFactory.CreateUserDAO(arg);
OracleUserDAO + FindUserById () : void ...
SQLServerUserDAO + FindUserById () : void ...
Factory + FactoryMethod (string arg) : Product ...
简单工厂模式的结构与实现
简单工厂模式的结构
简单工厂模式包含以下3个角色: • Factory(工厂角色) • Product(抽象产品角色) • ConcreteProduct(具体产品角色)
...... 客户端:只需调用工厂类的工厂方法并传入相应的参数即可得到 } 一个产品对象 { return new ConcreteProductA();
相关文档
最新文档