设计模式简单工厂

合集下载

简单工厂模式的使用场景与示例

简单工厂模式的使用场景与示例

简单工厂模式的使用场景与示例简单工厂模式是一种常见的设计模式,它是一种创建型模式,可以帮助我们根据客户端的需求动态地生成不同的对象。

本文将介绍简单工厂模式的使用场景与示例,以便读者更好地理解和应用该模式。

一、简单工厂模式的基本原理在介绍简单工厂模式的使用场景之前,我们先来了解一下它的基本原理。

简单工厂模式由三个角色组成:工厂类、抽象产品类和具体产品类。

工厂类根据客户端的需求,决定创建哪一种具体产品类的对象,并返回给客户端使用。

二、简单工厂模式的使用场景1. 创建对象时只需要知道其类别,而不需要知道具体的实现。

简单工厂模式可以隐藏具体产品类的创建细节,客户端只需要调用工厂类的方法即可获取所需的对象。

2. 客户端不关心对象的创建过程。

通过简单工厂模式,我们可以将对象的创建逻辑封装在工厂类中,使得客户端完全不需要关心对象的创建过程,只需要关心获取到所需对象即可。

3. 需要一组相关的对象被统一创建。

在某些场景下,我们可能需要一组相关的对象被统一创建,简单工厂模式可以灵活地满足这种需求。

三、简单工厂模式的示例下面通过一个示例来具体介绍简单工厂模式的应用。

假设我们有一个游戏场景中的角色类,包括玩家角色和敌人角色。

我们需要根据不同的角色类型创建对应的角色对象。

首先,我们定义一个抽象角色类(Role),用于表示玩家角色和敌人角色的共有属性和方法,包括姓名(name)和攻击力(attack)。

```javapublic abstract class Role {protected String name;protected int attack;public Role(String name, int attack) { = name;this.attack = attack;}public abstract void display();public abstract void attack();}```接下来,我们定义具体的玩家角色类(PlayerRole)和敌人角色类(EnemyRole),它们分别继承自抽象角色类(Role)。

23种设计模式(一)---简单工厂设计模式

23种设计模式(一)---简单工厂设计模式

23种设计模式(⼀)---简单⼯⼚设计模式简单⼯⼚设计模式---透彻讲解⼀. 什么是⼯⼚理解简单⼯⼚设计模式, ⾸先要理解什么是⼯⼚. 我们⾝边有很多⼯⼚. 酿酒的酒⼚, 制⾐的⾐⼚, 加⼯⾁类的⾁加⼯⼚等等. 这些⼯⼚他们到底是怎么酿酒的? 怎么制⾐的?怎么加⼯⾁的? 我们并不知道, 也不需要知道. 不知道并不影响我们喝酒, 穿⾐, 吃⾁. 这就是⼯⼚的特点之⼀: 客户不需要知道怎么做的, 但是不影响使⽤再来看看⼯⼚的第⼆个特点: ⽐如⾁加⼯⼚---双汇. ⽜⾁进去出来⽜⾁⽕腿肠, ⽺⾁进去出来⽺⾁⽕腿肠, 猪⾁进去出来猪⾁⽕腿肠. 我不需要知道怎么加⼯的, 我只需要把材料扔进去, 然后对应的⽕腿肠就出来了. 这就是第⼆个特点: 给你材料, 你去制造出我想要的东西, ⾄于怎么做,我并不关⼼.程序中的⼯⼚也是⼀样的思想. **⼯⼚的作⽤就是创造对象. **⼆. 简单⼯⼚设计模式2.1. 设计模式我们基本都知道设计模式有23种, 说到这, 我们先来说说设计模式。

设计模式不是语法, ⽽是⼀种巧妙的写法, 能够把程序变得更加灵活的写法.设计模式有三种: 创建型, ⾏为型, 结构型. 简单⼯⼚设计模式属于创建型. 但简单⼯⼚设计模式不属于23种设计模式范围内, 属于23种设计模式中⼯⼚设计模式⾥最简单的⼀种.2.2. 简单⼯⼚设计模式简单⼯⼚设计模式, ⼜叫做静态⼯⼚设计模式. 简单⼯⼚设计模式提供⼀个创建对象实例的功能,⽽⽆需关系其具体实现,被创建实例的类型可以是接⼝、抽象类,也可以是具体的类。

2.3. 简单⼯⼚设计模式的4要素这个很重要, 这也是创建⼀个简单⼯⼚的步骤1. API接⼝: 创建⼀个API接⼝或抽象类2. Impl实现类: ⼀个或多个实现API接⼝/抽象类的类3. ⼯⼚: 定义⼀个⼯⼚, ⽤来创建API接⼝类对象4. 客户端: ⽤来调⽤⼯⼚创建API接⼝或抽象类的客户端2.4 简单⼯⼚结构类型及说明以上类型就描述了⼀个简单⼯⼚创建的整个过程第⼀步: 定义API接⼝或抽象类, 并定义⼀个operate操作⽅法第⼆步: 定义API的实现类, 每个实现类单独实现operate⽅法第三步: 定义⼯⼚类. ⼯⼚类依赖API接⼝和API的实现类, 简单⼯⼚设计模式是创建型的, 通常是⽤来创建实体类. 因此我们定义⼀个create⽅法, 来创建实例对象,⼊参通常是⼀个指定的类型第四步: 定义客户端. 客户端传⼊⼀个指定的类型给⼯⼚, ⼯⼚就会创建出对应的实现类.2.5 简单⼯⼚模板代码第⼀步: 制⾐⼚API接⼝package com.lxl.www.designPatterns.simpleFactory.demo;public interface IClothes {void operate();}第⼆步: 制⾐⼚API实现类ManClothes: 制作男⼠⾐服package com.lxl.www.designPatterns.simpleFactory.demo;public class ManClothes implements IClothes{@Overridepublic void operate() {System.out.println("制作男⼈的⾐服");}}WomenClothes: 制作⼥⼠⾐服package com.lxl.www.designPatterns.simpleFactory.demo;public class WomenClothes implements IClothes{@Overridepublic void operate() {System.out.println("制作⼥⼈的⾐服");}}ChildClothes: 制作⼉童⾐服package com.lxl.www.designPatterns.simpleFactory.demo;public class ChildClothes implements IClothes{@Overridepublic void operate() {System.out.println("制作⼉童的⾐服");}}第三步: 定义⼯⼚, 并创建⾐服类接⼝package com.lxl.www.designPatterns.simpleFactory.demo;/*** 制⾐⼯⼚*/public class ClothesFactory {public static IClothes createClothes(String type) {if (type.equals("男⼈")) {return new ManClothes();} else if (type .equals("⼥⼈")) {return new WomenClothes();} else {return new ChildClothes();}}}第四步: 定义客户端, 指定制⾐类别, 制⾐.public static void main(String[] args) {IClothes manClothes = ClothesFactory.createClothes("男⼈");manClothes.operate();}2.6 简单⼯⼚命名建议类命名建议为“模块名称+Factory”,⽐如,⽤户模块的⼯⼚就称为UserFactory, 制⾐⼯⼚: ClothesFactory⽅法名称通常为“get+接⼝名称”或者是“create+接⼝名称”。

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

设计模式之简单工厂模式

设计模式之简单工厂模式

为什么使用工厂模式? 为什么使用工厂模式?
因为工厂模式就相当于创建实例对象的new, 因为工厂模式就相当于创建实例对象的new, 我们经常要根据类Class生成实例对象,如A 我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象 的,所以以后new时就要多个心眼,是否可 的,所以以后new时就要多个心眼,是否可 以考虑实用工厂模式,虽然这样做,可能 多做一些工作,但会给你系统带来更大的 可扩展性和尽量少的修改量。
根据参数返回不同的对象
类x为一个基类,类XY和XZ派生自类x, XFactory类根据你提 供给它的值来决定返回那个子类的实例,我们定义了getClass 方法,接受一些值,并根据这个值返回x类的其中一个实例。 返回它们当中的哪一个与程序员无关。因为它们都含有相同的 方法,但是不同的实现,它可能是很复杂的功能,但通常都很 简单。
其中的角色
工厂类(Creator)角色:该角色是简单工厂模式的核心,含有按照 一定商业逻辑创建产品。工厂类在客户端的直接调用下创建产品对 象,它往往由一个具体类实现。 抽象产品(Product)角色: 担任这个角色的类是工厂 方法模式所创建的对象的 父类,或它们共同拥有的 接口。抽象产品角色可以 用一个接口或者抽象类实 现。 具体产品(Concrete Product) 角色:工厂方法模式所创建 的任何对象都是这个角色的 实例,具体产品角色由一个 具体类实现。
工厂模式分类
工厂方法模式 ----- 生产具体产品 抽象工厂模式 ----- 生产工厂
简单工厂模式可理解成静态的工厂方法模式
设计模式之简单工厂模式
金桥软件公司
孟波
简单工厂模式定义
简单工厂模式:根据提供给它的数据,返回几 简单工厂模式:根据提供给它的数据,返回几 个可能类中的一个类的实例。通常它返回的类 都有一个共同的父类和共同的方法,但每个方 法执行的过程不同,而且根据不同的数据进行 了优化。简单工厂模式可以作为工厂方法模式 了优化。简单工厂模式可以作为工厂方法模式 的一个Sa实例的工厂

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

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

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

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

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

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

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

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

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

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

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

设计模式之简单工厂模式(SimpleFactoryPattern)

设计模式之简单工厂模式(SimpleFactoryPattern)

设计模式之简单⼯⼚模式(SimpleFactoryPattern)⼀、简单⼯⼚模式的由来 所有设计模式都是为解决某类问题⽽产⽣的,那么简单⼯⼚模式是为解决什么问题呢?我们假设有以下业务场景: 在⼀个学⽣选课系统中,⽂科⽣⽤户选课时,我们要获得⽂科⽣的所有课程列表;理科⽣⽤户选课时,获得理科⽣的所有课程列表;体育⽣⽤户选课时,获得体育⽣的所有课程列表;那我们的逻辑怎么写呢?很简单,我们⽤伪代码实现如下:if(userType is ⽂科⽣){return ⽂科⽣课程;}else if(userType is 理科⽣){return 理科⽣课程;}else if(userType is 体育⽣){return 体育⽣课程;} 这时我们发现,不光在学⽣选课时需要这段逻辑,在学⽣查询课程时,也需要这段代码,于是我们理所应当的将这段代码复制到了查询课程的⽅法中,如果⽼师查询课程的⽅法中也要这段代码,那继续复制到⽼师查看课程的⽅法中。

这就造成了重复性代码,如何让这段代码只写⼀遍,多处可以复⽤呢?我们可以将这段代码抽取成公共⽅法,将学⽣类型定义成参数。

在调⽤的地⽅,通过传⼊不同的参数类型,返回不同的课程列表。

这样就实现了⼀次代码,多次复⽤的效果。

以上的这种优化过程,其实就是简单⼯⼚模式的⽣成过程。

⼆、什么是简单⼯⼚模式? 在简单⼯⼚模式中,程序员创建或者获得对象,不再⽤new Object()的⽅式进⾏,⽽是给⼯⼚类传⼊参数,⼯⼚类根据程序员传⼊参数的不同,返回不同的对象。

三、简单⼯⼚模式的⾓⾊ 简单⼯⼚模式中,有以下⼏种⾓⾊,这些⾓⾊撑起了简单⼯程模式的实现: 产品规范:提供规范,供其它产品⼦类来实现这些规范;可以是接⼝,抽象类或者⽗类; 产品实现:产品规范的具体实现类;实现或者继承产品规范的接⼝,抽象类或⽗类; 调度类(⼯⼚类):有了产品规范,也有了产品实现,那⽤哪个产品呢,由调度类来调度决定。

产品使⽤者:使⽤产品的地⽅,传⼊想使⽤的产品参数,通过调度类给产品使⽤者返回产品。

C#设计模式(1)——简单工厂模式

C#设计模式(1)——简单工厂模式

C#设计模式(1)——简单⼯⼚模式1.什么是简单⼯⼚ 现实中的⼯⼚负责⽣产产品,顾名思义,编程中的简单⼯⼚就是⼀个⽣产对象的类,它的主要作⽤是创建具体的产品类实例。

我们以⼀个⽣产⿏标为例来分析简单⼯⼚的作⽤,⿏标有两种:戴尔⿏标和惠普⿏标,代码如下://⿏标抽象类public abstract class Mouse{public abstract void Print();}//戴尔⿏标public class DellMouse : Mouse{public override void Print(){Console.WriteLine("⽣产了⼀个Dell⿏标!");}}//惠普⿏标public class HpMouse : Mouse{public override void Print(){Console.WriteLine("⽣产了⼀个惠普⿏标!");}}客户端代码:class Program{static void Main(string[] args){Mouse mouse1 = new DellMouse();Mouse mouse2 = new DellMouse();Mouse mouse3 = new DellMouse();Mouse mouse4 = new DellMouse();Mouse mouse5 = new DellMouse();mouse1.Print();}}程序运⾏如下: 我们可以看到程序运⾏没有问题,通过new⼀个DellMouse我们可以创建⼀个戴尔的⿏标,这时有⼀个问题,如果我们不想要戴尔⿏标了,要全部⽣产惠普⿏标怎么办呢?最简单直接的⽅法就是把new DellMouse全部替换成new HpMouse 。

如果我们的软件中new了100个DellMouse实例呢?⼀个⼀个地去替换会是⼀个巨⼤的⼯作量,同时通过new的⽅式来创建戴尔⿏标的实例,会让DellMouse类和客户端产⽣强耦合关系,这时候使⽤简单⼯⼚就可以帮助我们降低耦合,减少⼯作量了。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

面向对象设计的23个设计模式详解

面向对象设计的23个设计模式详解

面向对象设计的23个设计模式详解面向对象设计是一种广泛应用于软件开发的思想,其核心在于将数据和操作封装在一起形成对象,并通过各种方式进行交互和组合,从而实现复杂的功能。

在这一过程中,设计模式起到了非常重要的作用,可以有效地提高代码的可读性、可维护性和可扩展性。

本文将对23种常见的设计模式进行详解。

一、创建型模式1.简单工厂模式简单工厂模式属于创建型模式,其目的是提供一个工厂类,使得创建对象的过程更加简单。

在这种模式中,使用者只需要提供所需对象的参数,而无需关心对象的具体实现细节。

简单工厂模式适合于对象创建过程较为简单的情况。

2.工厂方法模式工厂方法模式是简单工厂模式的进一步扩展,其核心在于将工厂类进行接口抽象化,使得不同的工厂类可以创建不同的对象实例。

工厂方法模式适合于对象创建过程较为复杂的情况。

它可以为工厂类添加新的产品类型,而不会影响原有的代码。

3.抽象工厂模式抽象工厂模式是工厂方法模式的进一步扩展,其目的是提供一个可以创建一系列相关或者独立的对象的接口。

在抽象工厂模式中,使用者只需要关心所需对象组合的类型,而无需关注对象的具体实现过程。

4.建造者模式建造者模式也是一种创建型模式,其目的在于将复杂对象分解为多个简单的部分,并将其组装起来形成复杂对象实例。

在建造者模式中,使用者只需要关注所需对象以及它们的组合方式,而无需关心对象的具体实现过程。

5.原型模式原型模式是一种基于克隆的创建型模式,其核心在于通过复制现有的对象实例来创建新的对象。

在原型模式中,对象实例的创建过程与对象所包含的状态密切相关。

原型模式适合于创建复杂对象实例,且这些对象实例之间是相对独立的情况。

二、结构型模式6.适配器模式适配器模式是一种结构型模式,其目的在于将一个类的接口转换为另一个类所能使用的接口。

在适配器模式中,使用者可以通过不同的适配器实现对象之间的互相调用。

7.桥接模式桥接模式是一种结构型模式,其目的在于将抽象部分与实现部分相互分离,从而使得两者可以独立变化。

c++设计模式:简单工厂模式(SimpleFactoryPattern)

c++设计模式:简单工厂模式(SimpleFactoryPattern)

c++设计模式:简单⼯⼚模式(SimpleFactoryPattern)定义:从设计模式的类型上来说,简单⼯⼚模式是属于创建型模式,⼜叫做静态⼯⼚⽅法(StaticFactory Method)模式,但不属于23种GOF设计模式之⼀。

简单⼯⼚模式是由⼀个⼯⼚对象决定创建出哪⼀种产品类的实例。

简单⼯⼚模式是⼯⼚模式家族中最简单实⽤的模式,可以理解为是不同⼯⼚模式的⼀个特殊实现。

场景:我们要开⼀家⽐萨商店,定义了⼀个简单的披萨⼯⼚,可以根据客户的需要制作芝⼠披萨、辣肠⽐萨、蛤蜊披萨、素⾷披萨。

根据传⼊的披萨类型从披萨⼯⼚⽣产出客户所需要的披萨。

类图:c++代码如下:#include <iostream>#include <string>#include <vector>using namespace std;class PizzaType{public:enum EPizzaType{cheese,pepperoni,clam,veggie};};class Pizza{public:virtual ~Pizza() {};string getName();void prepare();void bake();void cut();void box();protected:string name;string dough;string sauce;vector<string> toppings;};class CheesePizza : public Pizza{public:CheesePizza();};class PepperoniPizza : public Pizza{public:PepperoniPizza();};class ClamPizza : public Pizza{public:ClamPizza();};class VeggiePizza : public Pizza{public:VeggiePizza();};class SimplePizzaFactory{public:Pizza* createPizza(PizzaType::EPizzaType type);};class PizzaStore{private:SimplePizzaFactory factory;public:Pizza* orderPizza(PizzaType::EPizzaType type);};string Pizza::getName(){return name;}void Pizza::prepare(){printf("Preparing %s\n",name.c_str());}void Pizza::bake(){printf("Baking %s\n",name.c_str());}void Pizza::cut(){printf("Cutting %s\n",name.c_str());}void Pizza::box(){printf("Boxing %s\n",name.c_str());}CheesePizza::CheesePizza(){name = "Cheese Pizza";dough = "Regular Crust";sauce = "Marinara Pizza Sauce";toppings.push_back("Fresh Mozzarella");toppings.push_back("Parmesan");}PepperoniPizza::PepperoniPizza(){name = "Pepperoni Pizza";dough = "Crust";sauce = "Marinara sauce";toppings.push_back("Sliced Pepperoni");toppings.push_back("Sliced Onion");toppings.push_back("Grated parmesan cheese");}ClamPizza::ClamPizza(){name = "Clam Pizza";dough = "Thin crust";sauce = "White garlic sauce";toppings.push_back("Clams");toppings.push_back("Grated parmesan cheese");}VeggiePizza::VeggiePizza(){name = "Veggie Pizza";dough = "Crust";sauce = "Marinara sauce";toppings.push_back("Shredded mozzarella");toppings.push_back("Grated parmesan");toppings.push_back("Diced onion");toppings.push_back("Sliced mushrooms");toppings.push_back("Sliced red pepper");toppings.push_back("Sliced black olives");}Pizza* SimplePizzaFactory::createPizza(PizzaType::EPizzaType type) {Pizza* pizza = NULL;if (PizzaType::cheese == type){pizza = new CheesePizza();}else if (PizzaType::pepperoni == type){pizza = new PepperoniPizza();}else if (PizzaType::clam == type){pizza = new ClamPizza();}else if (PizzaType::veggie == type){pizza = new VeggiePizza();}return pizza;}Pizza* PizzaStore::orderPizza(PizzaType::EPizzaType type){Pizza* pizza = NULL;pizza = factory.createPizza(type);pizza->prepare();pizza->bake();pizza->cut();pizza->box();return pizza;}int main(){PizzaStore pizzaStore;Pizza* pCheesePizza = pizzaStore.orderPizza(PizzaType::cheese);Pizza* pPepperoniPizza = pizzaStore.orderPizza(PizzaType::pepperoni); Pizza* pClamPizza = pizzaStore.orderPizza(PizzaType::clam);Pizza* pVeggiePizza = pizzaStore.orderPizza(PizzaType::veggie);delete pCheesePizza;delete pPepperoniPizza;delete pClamPizza;delete pVeggiePizza;return0;}运⾏后结果如下:Preparing Cheese PizzaBaking Cheese PizzaCutting Cheese PizzaBoxing Cheese PizzaPreparing Pepperoni PizzaBaking Pepperoni PizzaCutting Pepperoni PizzaBoxing Pepperoni PizzaPreparing Clam PizzaBaking Clam PizzaCutting Clam PizzaBoxing Clam PizzaPreparing Veggie PizzaBaking Veggie PizzaCutting Veggie PizzaBoxing Veggie Pizza参考图书:《Head First 设计模式》。

软件体系结构—设计模式3.1—简单工厂模式分解

软件体系结构—设计模式3.1—简单工厂模式分解

5、工厂角色与抽象产品角色合并 在有些情况下, 工厂角色可以由抽象产品角色扮演,一个抽象产品类同时是 子类的工厂。
6、三个角色全部合并 如果抽象产品角色已经被省略,而工厂角色就可以与具体产品角色合并。换 言之,一个产品类为自身的工厂,如下图所示。
如果仍然以前面讨论过的示意性系统为例,这个系统的结构图如下所示。显
软件体系结构
东北石油大学 计算机与信息技术学院 刘志刚 dqpilzg@
1、工厂模式的ቤተ መጻሕፍቲ ባይዱ种形态
工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以
动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个 类。工厂模式有以下几种形态: (1)简单工厂(Simple Factory)模式,又称静态工厂方法模 式。 (2)工厂方法(Factory Method)模式,又称多态性工厂模 式
或虚拟构造子模式;
(3)抽象工厂模式,又称工具箱(Kit 或Toolkit)模式。
2、简单工厂模式
下面就是简单工厂模式的简略类图。
2.1 简单工厂模式的案例
比如说有一个农场公司,专门向市场销售各类水果。 1、在这个系统里需要描述下列的水果: 葡萄 Grape 草莓 Strawberry 苹果 Apple 水果与其他的植物有很大的不同,就是水果最终是可以采摘食用的。那么
品角色等三个角色:
(1)工厂类(Creator)角色:担任这个角色的是工厂方法模式的核心,含 有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象,
它往往由一个具体Java 类实现。
(2 )抽象产品(Product)角色:担任这个角色的类是工厂方法模式所创建) 的对象的父类,或它们共同拥有的接口。抽象产品角色可以用一个Java 接口

简单工厂 工厂方法

简单工厂 工厂方法

简单工厂工厂方法
简单工厂模式和工厂方法模式是两种不同的设计模式,它们在实现方式和适用场景上有所区别。

简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。

简单工厂模式适用于工厂负责的对象比较少,且客户只关心传入工厂的参数,而不关心如何创建对象的情况。

工厂方法模式定义了一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。

这种模式的优点是核心类成为抽象工厂角色,不再负责产品的创建,仅负责具体工厂子类必须实现的接口,使得系统在不修改具体工厂角色的情况下引进新的产品。

工厂方法模式适用于具体工厂角色和抽象工厂角色分离的情况,使得系统更加灵活和可扩展。

总的来说,简单工厂和工厂方法都是创建型设计模式,用于处理对象的创建问题。

但简单工厂模式是一种更简单、直接的对象创建方式,而工厂方法模式则更加强调抽象和多态的应用,使系统更加灵活和可扩展。

在实际应用中,可以根据需要选择合适的设计模式。

软件体系结构—设计模式3.1—简单工厂模式

软件体系结构—设计模式3.1—简单工厂模式

要提出BadShapeException 异常。
(2)请给出上一题的源代码。 (3)请简单举例说明描图员系统怎样使用。
消费角色无需知道它得到的是哪一个产品;换言之,产品消费角色无需修改 就可以接纳新的产品。
对于工厂角色来说,增加新的产品是一个痛苦的过程。工厂角色必须知道每
一种产品,如何创建它们,以及何时向客户端提供它们。换言之,接纳新的 产品意味着修改这个工厂角色的源代码。
综合本节的讨论,简单工厂角色只在有限的程度上支持“开–闭”原则。
3、多个工厂方法 每个工厂类可以有多于一个的工厂方法,分别负责创建不同的产品对象。 4、抽象产品角色的省略 如果系统仅有一个具体产品角色的话,那么就可以省略掉抽象产品角色。省 略掉抽象产品类后的简略类图如下图所示。
仍然以前面给出的示意性系统为例,这时候系统的类图就变成如下所示。
下面是工厂类的源代码。显然,这个类提供一个工厂方法,返还一个具体产 品类的实例。
简单工厂模式所创建的对象往往属于一个产品等级结构,这个等级结构可以
是MVC模式中的视图(View);而工厂角色本身可以是控制器
(Controller)。一个MVC 模式可以有一个控制器和多个视图,如下图所示。
换言之,控制器端可以创建合适的视图端,就如同工厂角色创建合适的对象
角色一样;而模型端则可以充当这个创建过程的客户端。 如果系统需要有多个控制器参与这个过程的话,简单工厂模式就不适用了,
简单的情况下,可以简化为一个标识接口。所谓标识接口,就是没有声明任 何方法的空接口。
具体产品类的示意性源代码如下。
2.3简单工厂模式的实现
1、多层次的产品结构 在真实的系统中,产品可以形成复杂的等级结构,比如下图所示的树状结构 上就有多个抽象产品类和具体产品类。

设计模式之工厂模式(3种)详解及代码示例

设计模式之工厂模式(3种)详解及代码示例

设计模式之⼯⼚模式(3种)详解及代码⽰例 ⼯⼚模式划分来说总共有三类:简单⼯⼚模式、⼯⼚⽅法模式和抽象⼯⼚模式。

其中简单⼯⼚模式不输⼊23种设计模式之⼀,但他们⼜都属于创建型模式。

我们依次讲解这三种⼯⼚模式。

⼀、简单⼯⼚ 1、什么是简单⼯⼚模式? ⾸先来说简单⼯⼚,简单⼯⼚模式,⼜叫做静态⼯⼚模式(Static Factory Method),由⼀个⼯⼚对象决定创建出哪⼀种产品类的实例,简单⼯⼚模式的实质是由⼀个⼯⼚类根据传⼊的参数,动态决定应该创建哪⼀个产品类。

属于创建型模式,但不属于GOF23设计模式。

2、简单⼯⼚适⽤场景 ⼯⼚类负责创建的对象⽐较少;客户端(应⽤层)只需要知道传⼊⼯⼚类的参数,对于如何创建对象(逻辑)不关⼼。

3、简单⼯⼚优缺点优点:只需要传⼊⼀个正确的参数,就可以获取你所需要的对象,⽽⽆需知道其细节创建。

缺点:⼯⼚类的职责相对过重,增加新的产品,需要修改⼯⼚类的判断逻辑,违背了开闭原则。

4、简单⼯⼚实现 ⾸先来看类图: 代码实现:public class ShapeFactory {public Shape getShape(String shapeType){if(shapeType.equalsIgnoreCase("circle")){return new Circle();}else if(shapeType.equalsIgnoreCase("rectangle")){return new Rectangle();}else if(shapeType.equalsIgnoreCase("squere")){return new Squere();}return null;}public Shape getShape(Class clazz) throws Exception{return (Shape) clazz.newInstance();}}⼆、⼯⼚⽅法模式 1、什么是⼯⼚⽅法 ⼯⼚⽅法模式(Factory Method),⼜称多态性⼯⼚模式,属于设计模式三⼤分类中的创建型模式,作为抽象⼯⼚模式的孪⽣兄弟,⼯⼚⽅法模式定义了⼀个创建对象的接⼝,但由⼦类决定要实例化的类是哪⼀个,也就是说⼯⼚模式让实例化推迟到⼦类。

设计模式(1)——简单工厂模式和策略模式的结合应用

设计模式(1)——简单工厂模式和策略模式的结合应用

设计模式(1)——简单⼯⼚模式和策略模式的结合应⽤⼀、前⾔ 设计,为蓝图,为构建之根本。

个⼈对于设计模式的理解:设计模式是软件开发过程中⼀些常⽤pattern的概括总结。

这些思想终究是别⼈实践过程中存在着背景因素的产物,可以⽤,但不可滥⽤。

最近在学习软件设计模式⽅⾯的知识,在这⾥实现每个使⽤场景记录⼀下⾃⼰的学习过程。

⼆、功能 简单⼯⼚模式:是属于⼯⼚模式的⼀种,它使⽤⼀个集中了所有实例(产品)的创建逻辑的⼯⼚类去实例化对象。

外界只需要告诉⼯⼚所需⽣产产品的类型,⽽⽆需关注⽣产的过程。

将“类实例化的操作”与“使⽤对象的操作”分开,让使⽤者不⽤知道具体参数就可以实例化出所需要的“产品”类,从⽽避免了在客户端代码中显式指定,降低类之间的耦合。

策略模式:策略模式是⼀种定义⼀系列算法的⽅法,从概念上来看,所有这些算法完成的都是相同的⼯作,只是实现不同,它可以以相同的⽅式调⽤所有的算法,减少了各种算法类与使⽤算法类之间的耦合,其实就是⽤来封装变化。

GOF⾥关于策略模式的功能描述——“策略模式的Strategy类层次为Context定义了⼀系列的可供重⽤的算法或⾏为。

继承有助于析取出这些算法中的公共功能” “当不同的⾏为堆砌在同⼀个类中时,就很难避免使⽤条件语句来选择合适的⾏为。

将这些⾏为封装在⼀个个独⽴的Strategy类中,可以在使⽤这些⾏为的类中消除条件语句”。

三、实例 以计算⼆维坐标空间两点间的不同类型距离(欧⽒距离、曼哈顿距离和棋盘格距离)为例。

在基类定义⼀个抽象接⼝Calculate,在派⽣类中实现它。

1// 距离计算基类2class DistanceBase3 {4public:5virtual ~DistanceBase() = default;6public:7virtual double Calculate(cv::Point2d point1_, cv::Point2d point2_) = 0;8 };910// 欧⼏⾥得距离计算类11class EuclideanDistance : public DistanceBase12 {13public:14double Calculate(cv::Point2d point1_, cv::Point2d point2_)15 {16double result = 0.0;17 result = pow((point1_.x - point2_.x), 2) + pow((point1_.y - point2_.y), 2);18 result = sqrt(result);1920return result;21 }22 };2324// 曼哈顿距离计算类25class ManhattanDistance : public DistanceBase26 {27public:28double Calculate(cv::Point2d point1_, cv::Point2d point2_)29 {30double result = 0.0;31 result = abs(point1_.x - point2_.x) + abs(point1_.y - point2_.y);3233return result;34 }35 };3637// 棋盘格距离计算类38class ChessboardDistance : public DistanceBase39 {40public:41double Calculate(cv::Point2d point1_, cv::Point2d point2_)42 {43double result = 0.0;44 result = std::max(abs(point1_.x - point2_.x), abs(point1_.y - point2_.y));4546return result;47 }48 }; ⼯⼚类的实现1enum DistanceType2 {3 EUCLIDEAN = 0,4 MANHATTAN = 1,5 CHESSBOARD = 2,6 };789class DistanceFactory10 {11public:12static DistanceBase* creatCalculator(DistanceType type)13 {14 DistanceBase* p = NULL;15switch (type)16 {17case DistanceType::EUCLIDEAN:18 p = new EuclideanDistance();19break;20case DistanceType::MANHATTAN:21 p = new ManhattanDistance();22break;23case DistanceType::CHESSBOARD:24 p = new ChessboardDistance();25break;26default:27break;28 }2930return p;31 }32 }; Client端代码,根据输⼊的DistanceType来控制⼯⼚类具体实例化哪个距离计算对象DistanceBase* calculator = DistanceFactory::creatCalculator(DistanceType::EUCLIDEAN);double result = calculator->Calculate(cv::Point2d(1, 1), cv::Point2d(4, 5)); 简单⼯⼚模式的缺点除了违背了开放封闭原则以外,通过以上的Client端代码可以发现,Client需要认识DistanceBase基类和DistanceFactory⼯⼚类两个类,可不可以让其只认识⼀个类? 这个时候可以结合策略模式来实现all in one的⽬的,使计算算法彻底地与客户端分离。

设计模式——简单工厂模式

设计模式——简单工厂模式

设计模式——简单⼯⼚模式⽬录shanzm-2020年4⽉1⽇ 22:18:49 1. 简介简单⼯⼚模式(Simple Factory Pattern):定义⼀个⼯⼚类,根据不同的参数,创建并返回不同的类。

其中这些类具有⼀个公共的⽗类或是⼀个接⼝。

简单⼯⼚模式不属于GoF四⼈组提出的23种设计模式,它是最简单的⼯⼚模式。

简单⼯⼚模式包含类:Factory:⼯⼚类,内部有是个精通的⽅法,根据参数选择创建的对象Product:抽象产品类,其作为具体产品的⽗类,负责定义产品的公共接⼝ConcreteProduct:具体产品类,有多个,都是继承与抽象产品类,⼯⼚就是创建该类对象2. ⽰例⽰例源于《⼤话设计模式》,通过⼀个简单的四则计算器来逐步的重构,最终通过简单⼯⼚实现⼀个简单的四则计算器。

⾸先创建⼀个简单的控制台项⽬,实现⼀个简单的四则运算计算器功能当提⽰⽤户输⼊两个数字,并输⼊⼀个四则运算符,实现计算功能2.1 计算器V1.0namespace Calculator{public class Operation{public static double GetResult(double numA, double numB, string oper){double result = 0;switch (oper){case "+":result = numA + numB;break;case "-":result = numA - numB;break;case "*":result = numA * numB;break;case "/":result = numB != 0 ? numA / numB : 0;break;}return result;}}//让业务逻辑和界⾯逻辑分离class Program{static void Main(string[] args){try{Console.WriteLine("enter a number");double numA = Convert.ToDouble(Console.ReadLine());Console.WriteLine("enter another number");double numB = Convert.ToDouble(Console.ReadLine());Console.WriteLine("enter operation");string oper = Console.ReadLine();Console.WriteLine(Operation.GetResult(numA, numB, oper).ToString());Console.ReadKey();}catch (Exception e){Console.WriteLine("error:" + e.Message);Console.ReadKey();}}}}2.2 计算器V2.0计算器V1.0中使⽤类对业务逻辑进⾏封装了但是你若是要是想要添加⼀个新的运算符则要对Operation类进⾏修改其实这样是不安全的,万⼀你添加新的运算符的时候把原来的运算符的操作代码修改错了这样岂不是对项⽬代码很不安全!所以你可以把所有的运算符分别单独定义⼀个类,这样你就可以随意添加和修改某⼀个新的运算符但是这时候问题⼜来了,主程序怎么判断要建哪⼀个运算符的对象所以需要⼀个Factory类来判断建什么对象在⼯⼚类中,我们使⽤⾥⽒原则(⼦类对象赋值给⽗类变量)。

05.设计模式.简单工厂模式(Simple Factory)

05.设计模式.简单工厂模式(Simple Factory)

除法类 +GetResult() : double
武汉科技大学

问题(Problem)
static void Main(string[] args) { try { Console.Write("请输入数字A:"); string strNumberA = Console.ReadLine(); Console.Write("请选择运算符号(+、-、*、/):"); string strOperate = Console.ReadLine(); Console.Write("请输入数字B:"); string strNumberB = Console.ReadLine(); string strResult = ""; // strResult = Operation.GetResult(double.Parse(strNumberA), double.Parse(strNumberB), strOperate).ToString(); if (strOperate == "+") { OperationAdd add = new OperationAdd(); add.NumberA = double.Parse(strNumberA); add.NumberB = double.Parse(strNumberB); strResult = add.GetResult().ToString(); } Console.WriteLine("结果是:" + strResult); Console.ReadLine(); } catch (Exception ex) { Console.WriteLine("您的输入有错:" + ex.Message); }

简单工厂与工厂方法模式的区别

简单工厂与工厂方法模式的区别

简单工厂与工厂方法模式的区别软件开发中的设计模式是一种特定的解决方案,它可以用来解决一种在软件开发中普遍存在的问题。

在这些模式中,工厂模式是最为广泛使用的模式之一。

在工厂模式中,有两种基本的类型——简单工厂和工厂方法模式。

虽然这两种方法本质上是相同的,但它们之间也存在着一些关键的区别。

## 简单工厂模式简单工厂模式是一种创建型模式,它允许用户根据需要创建一个对象,而不必知道对象的具体类。

这个模式可以有效地将对象创建的过程抽象出来,并把它们放在一个工厂类中,这个工厂类根据用户的输入信息决定应该创建哪个具体的对象。

简单工厂模式的核心是工厂类,它是一个包含多个静态方法的类,这些静态方法根据用户的需求创建不同类型的对象。

例如,在一个汽车制造工厂中,简单工厂模式可以用来创建不同类型的车辆,例如轿车、跑车或 SUV。

用户只需提供所需类型的参数,简单工厂就可以根据当前需求返回相应的实例对象。

以下是简单工厂的实现示例:```class CarFactory {public static Car getCar(String carType) {if (carType == null) {return null;}if (carType.equalsIgnoreCase("SUV")) {return new SUV();}else if (carType.equalsIgnoreCase("sedan")) {return new Sedan();}else if (carType.equalsIgnoreCase("SportsCar")) { return new SportsCar();}return null;}class SUV implements Car {public void drive() {System.out.println("Driving SUV");}}class Sedan implements Car {public void drive() {System.out.println("Driving Sedan");}}class SportsCar implements Car {public void drive() {System.out.println("Driving Sports Car"); }interface Car {void drive();}```在上面的示例中,接口 Car 定义了一个 drive 方法,这个方法用来描述不同的车辆如何行驶。

C#设计模式——简单工厂模式、工厂模式和抽象工厂模式

C#设计模式——简单工厂模式、工厂模式和抽象工厂模式

C#设计模式——简单⼯⼚模式、⼯⼚模式和抽象⼯⼚模式⼀:简单⼯⼚模式 1:描述:简单⼯⼚模式是由⼀个⼯⼚对象根据接收到的消息决定要创建哪⼀个类的对象事例。

2:优点:⼯⼚类中有相关逻辑判断,可以根据需要动态创建相关的对象事例,⽽客户端只需要告诉⼯⼚类创建什么对象事例,⽽不关⼼怎么创建,当需要引⼊新产品就不需要修改客户端的代码,只需要添加相应的产品类并修改⼯⼚类就可以,所以从产品的⾓度上简单⼯⼚模式是符合“开-闭”原则的。

3:缺点:很容易违反⾼内聚低耦合的原则,⼀旦添加新产品就不得不修改⼯⼚逻辑,当产品类型较多时,有可能造成⼯⼚逻辑⽐较复杂,不利于系统的扩展和维护,所以从⼯⼚的⾓度来说简单⼯⼚模式是不符合“开-闭”原则的。

4:例⼦:namespace SimpleFactoryDemo{class Program{static void Main(string[] args){ShapeFactory shapeFactory = new ShapeFactory();shapeFactory.getShape("circle").draw();shapeFactory.getShape("rectangle").draw();shapeFactory.getShape("square").draw();Console.ReadKey();}}public interface IShape{void draw();//默认公共⽅法}public class Circle : IShape{public void draw(){Console.WriteLine("画个圆");}}public class Rectangle : IShape{public void draw(){Console.WriteLine("画个长⽅形");}}public class Square : IShape{public void draw(){Console.WriteLine("画个正⽅形");}}public class ShapeFactory//形状⼯⼚{public IShape getShape(string type){if ("circle".Equals(type)){return new Circle();}else if ("rectangle".Equals(type)){return new Rectangle();}else if ("square".Equals(type)){return new Square();}else{return null;}}}}⼆:⼯⼚模式 1:描述:定义⼀个创建对象的⼯⼚接⼝,让⼦类决定实例化哪个类,将实际创建⼯作推迟到⼦类中。

设计模式--简单工厂模式

设计模式--简单工厂模式
publicclassImplAimplementsApi{
publicvoidoperation(String s){
Systeห้องสมุดไป่ตู้.out.println("ImplA s=="+ s);
}
}
/*接口具体实现类B*/
publicclassImplBimplementsApi{
publicvoidoperation(String s){
api.operation("正在使用简单工厂");
}
}
3.实际应用
虽然从理论上来讲,简单工厂什么都能创建,但对于简单工厂可创建对象的范围,通常不需要太大,建议控制在一个独立的组件级别,或者一个模块级别,也就是一个组件或模块简单工厂。否则这个简单工厂类会职责不明,会有大杂烩的感觉。
简单工厂模式本质:选择实现
System.out.println("ImplB s=="+ s);
}
}
Java代码
/*工厂类*/
publicclassFactory{
publicstaticapi createApi(intcondition){
Api api =null;
if(condition ==1){
api =newImplA();
}elseif(condition ==2){
api =newImplB();
}
returnapi;
}
}
Java代码
/*客户端调用*/
publicclassClient{
publicstaticvoidmain(String args[]){
Api api = Factory.createApi(1);
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

简单工厂设计模式目录1.1摘要 (2)2.1关键字 (2)3.1开发工具 (2)4.1简单工厂模式动机与定义: (3)4.1.1模式动机 (3)4.1.2模式定义 (3)5.1简单工厂模式结构 (4)6.1简单工厂模式实例: (5)6.1.1代码分析 (6)6.1.1.1Product(Shape抽象类)代码: (6)6.1.1.2ConcreteProduct(Juxing,YuanXing,SanJiao具体产品类)代码:.. 7JuXing类: (7)YuanXing类: (8)SanJiao类: (8)6.1.1.3Factory(Factory类)代码: (9)6.1.1.4 (main类): (10)6.1.1.5运行结果: (12)7.1结论 (12)8.1参考文献: (13)1.1摘要本文从面向对象的角度对java接口的概念、作用以及使用它的好处做分析,讲解面向接口编程的方法,结合初步接触软件开发的人员习惯,从简单工厂设计模式的概念和其结构以及用途进行解析,重点讲解简单工厂设计模式在软件开发过程中的作用和好处,通过一些实例来说明简单工厂设计模式的特点。

2.1关键字面向对象;java接口;接口编程;简单工厂设计模式。

3.1开发工具Eclipse java语言开发4.1简单工厂模式动机与定义:在实际的软件开发过程中有时需要创建一些来自于相同父类的类的实例,为此可以专门定义一个类来负责创建这些类的实例,这些被创建的实例具有共同的父类。

在这种情况下,可以通过传入不同的参数从而获取不同的对象,理由Java语言的特征,习惯上将创建其他类实例的方法定义为static方法,外部不需要实例化这个类就可以直接调用该方法来获得需要的对象,该方法也成为静态工厂方法。

4.1.1模式动机考虑一个简单的软件应用场景,一个软件系统可以提供多个外观不同的按钮(如圆形按钮,矩形按钮等),这些按钮都源自同一个基类,不过在继承基类之后不同的子类修改了部分属性从而使得它们可以呈现不同的外观,如果我们希望在使用这些按钮时,不需要知道这些具体按钮类的名字,只需要知道表示该按钮的一个参数,并提供一个调用方便的方法,把该参数传入方法即可返回一个相应的按钮对象,此时,就可以使用简单工厂模式。

4.1.2模式定义简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类。

5.1简单工厂模式结构a、Factory(工厂角色)是简单工厂模式的核心,它负责实现创建所有具体产品类的实例。

工厂类可以被外界直接调用,创建所需的产品对象。

b、Product(抽象产品角色)是所有具体产品角色的父类,它负责描述所有实例所共有的公共接口。

c、ConcreteProduct(具体产品角色)继承自抽象产品角色,一般为多个,是简单工厂模式的创建目标。

工厂类返回的都是该角色的某一具体产品。

6.1简单工厂模式实例:使用简单工厂模式设计一个可以创建不同几何形状(如圆形、方形和三角形等)的绘图工具,每个几何图形都要绘制draw()和擦除erase()两个方法,要求在绘制不支持的几何图形时,提示一个UnSupportedShapeException。

6.1.1代码分析6.1.1.1Product(Shape抽象类)代码:import java.awt.Graphics;import javax.swing.JPanel;publicabstractclass AbstractShape { static Graphics g;publicabstractvoid draw(JPanel p);publicabstract JPanel erase(JPanel p); }分析:创建draw()和erase()方法供子类继承调用;6.1.1.2ConcreteProduct(Juxing,YuanXing,SanJiao具体产品类)代码://各个产品类代码类似、需要添加产品类时只需要另外创建一个类然后再修改工厂类少量代码即可JuXing类:import javax.swing.JPanel;//绘制矩形publicclass JuXing extends AbstractShape {private JPanel p;@Overridepublicvoid draw(JPanel p) {// TODO Auto-generated method stubthis.p=p;//g.drawrect(50, 50, 100, 50);}@Overridepublic JPanel erase(JPanel p) {p.repaint();// TODO Auto-generated method stubreturn p;}}YuanXing类:import javax.swing.JPanel;//绘制圆形publicclass YuanXing extends AbstractShape { private JPanel p;@Overridepublicvoid draw(JPanel p) {// TODO Auto-generated method stubthis.p=p;//g.drawOval(50, 50, 50, 50);}@Overridepublic JPanel erase(JPanel p) {p.repaint();// TODO Auto-generated method stubreturn p;}}SanJiao类:import javax.swing.JPanel;//绘制三角形publicclass SanJiao extends AbstractShape { private JPanel p;@Overridepublicvoid draw(JPanel p) {// TODO Auto-generated method stubthis.p=p;//int x[]={130,100,200}int y[]={130,200,200};g.drawPolygon(x, y, 3); }@Overridepublic JPanel erase(JPanel p) {p.repaint();// TODO Auto-generated method stubreturn p;}}6.1.1.3Factory(Factory类)代码:publicclass Factory {publicstatic AbstractShapecreatShape(String s) throws Exception{ if(s.equalsIgnoreCase("矩形")){returnnew JuXing();}elseif(s.equalsIgnoreCase("圆形")){returnnew YuanXing();}elseif(s.equalsIgnoreCase("三角形")){returnnew SanJiao();}else {thrownew Exception("UnSupportedShapeException");}}}//注释:用于创建各个具体产品角色的对象;6.1.1.4 (main类):创建一个窗体,添加控件和监听代码如下:import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;publicclass ShapeFrame extends JFrame implements ActionListener { JPanel contentPane = new JPanel();JPanel upPane = new JPanel();JPanel centerPane = new JPanel();String shapeStr[] = {"圆形","矩形","三角形"};JComboBox cmb = new JComboBox(shapeStr);JLabel lab = new JLabel("选择目标图形:");JButton drawBtu = new JButton("绘制");JButton eraseBtu = new JButton("擦除");Shape shape;ShapeFrame(String title) {super(title);setSize(800,600);setLocationRelativeTo(null);addPane();setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}void addPane() {setContentPane(contentPane);contentPane.setLayout(new BorderLayout());contentPane.setBackground(Color.white);upPane.setBackground(Color.white);centerPane.setBackground(Color.white);contentPane.add(upPane,BorderLayout.NORTH);contentPane.add(centerPane,BorderLayout.CENTER);initWidget();upPane.add(lab);upPane.add(cmb);upPane.add(drawBtu);upPane.add(eraseBtu);}void initWidget() {drawBtu.addActionListener(this);eraseBtu.addActionListener(this);}//关键代码@Overridepublicvoid actionPerformed(ActionEvent e) {Object object = e.getSource();if (object.equals(drawBtu)) {String shapeName = cmb.getSelectedItem().toString(); try{shape = ShapeFactory.creatShape(shapeName);shape.draw(centerPane);}catch (Exception error){error.printStackTrace();}} elseif (object.equals(eraseBtu)) {if (shape != null) {JPanel newPanel = shape.erase(centerPane);contentPane.add(newPanel, BorderLayout.CENTER);repaint();shape = null;}}}}6.1.1.5运行结果:7.1结论简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类的实例。

相关文档
最新文档