L08B-抽象工厂模式 ppt课件
- 格式:ppt
- 大小:509.50 KB
- 文档页数:46
抽象⼯⼚模式9.1 ⼥娲的失误我们在上⼀章节讲了⼥娲造⼈的故事。
⼈是造出来了,世界也热闹了,可是低头⼀看,都是清⼀⾊的类型,缺少关爱、仇恨、喜怒哀乐等情绪,⼈类的⽣命太平淡了,⼥娲⼀想,猛然⼀拍脑袋,哇K!忘记给⼈类定义性别了,那怎么办?抹掉重来,于是⼈类经过⼀次⼤洗礼,所有的⼈种都消灭掉了,世界⼜是空⽆⼀物,寂静⽽⼜寂寞。
由于⼥娲之前的准备⼯作花费了⾮常⼤的精⼒,⽐如准备黄⼟,准备⼋卦炉等,从头开始建⽴所有的事物也是不可能的,那就想在现有的条件下重新造⼈,尽可能旧物利⽤嘛。
先说⼈种(Product产品类)应该怎么改造呢?怎么才能让⼈类有爱有恨呢?是神仙当然办法的了,定义互斥的性别,然后在每个个体中埋下⼀颗种⼦:异性相吸,成熟后就⼀定会去找个异性(这就是我们说的爱情原动⼒)。
从设计⾓度来看,⼀个具体的对象通过两个坐标就可以确定:肤⾊和性别,如图9-1所⽰。
图9-1 肤⾊性别坐标图产品类分析完毕了,⽣产的⼯⼚类该(⼋卦炉)怎么改造呢?只有⼀个⽣产设备,要么⽣产出全都是男性,要么都是⼥性,那不⾏呀,这么⼤的翻天覆地的改造就是为了产⽣不同性别的⼈类。
有办法了!把⽬前已经有的⽣产设备——⼋卦炉拆开,于是⼥娲就使⽤了“⼋卦拷贝术”,把原先的⼋卦炉⼀个变两个,并且略加修改,就成了⼥性⼋卦炉(只⽣产⼥性⼈种)和男性⼋卦炉(只⽣产男性⼈种),于是乎⼥娲就开始准备⽣产了,其类图如图9-2所⽰。
图9-2 ⼥娲重新⽣产⼈类这个类图虽然⼤,但是⽐较简单,Java的典型类图,⼀个接⼝,多个抽象类,然后是N个实现类,每个⼈种都是⼀个抽象类,性别是在各个实现类中实现的。
特别需要说明的是HumanFactory接⼝,在这个接⼝中定义了三个⽅法,分别⽤来⽣产三个不同肤⾊的⼈种,也就是我们在图9-1中的Y坐标,它的两个实现类分别是性别,也就是图9-1中的X坐标,通过X坐标(性别)和Y坐标(肤⾊)唯⼀确定了⼀个⽣产出来的对象:什么性别的⼈种。
抽象工厂模式是一种面向对象的软件设计模式,它主要用于解决软件系统中对象的创建问题。
该模式提供了一种创建一系列相关或相互依赖对象的接口,而不需要指定其具体类。
一、定义是一种接口工厂模式,它提供了一个用于创建一系列相关或相互依赖对象的接口,而不需要指定其具体类。
通常涉及到两个或多个抽象类,每个抽象类可以派生出多个具体类。
在中,客户端通过调用工厂对象的方法来创建各种不同类的对象,而这些对象都是由同一个工厂对象创建的。
二、结构1. 抽象工厂类:定义了一个创建一系列产品(如汽车,颜色等)的方法接口。
2. 具体工厂类:实现了抽象工厂类中的方法,用于创建一系列相关或相互依赖的对象。
3. 抽象产品类:定义了一系列产品的公共接口。
4. 具体产品类:实现了抽象产品类中定义的接口,是一系列具体产品的实例。
三、优点1. 将客户端与类的实现分离,客户端只需要知道抽象工厂和抽象产品类,而不需要知道具体的实现类。
2. 应对复杂的产品结构,只需要增加一个新的具体工厂类即可。
3. 方便替换产品系列,只需要更改具体工厂类即可。
四、缺点1. 系统扩展困难,增加新产品时,需要增加新的抽象产品类和具体产品类。
2. 通常在产品族中增加新的产品比较困难,如果需要增加一个新的产品族,则需要修改抽象工厂和所有具体工厂类。
五、使用场景1. 需要一个产品系列,并且需要确保这些产品系列是相关的。
2. 当需要实现一个产品族而不需要知道具体实现时。
3. 当需要一个对象而不知道如何创建它的具体类型(即抽象工厂)时。
六、代码示例以下是一个简单的的示例代码:```pythonclass AbstractFactory:def create_car(self):passdef create_color(self):passclass BenzFactory(AbstractFactory): def create_car(self):return BenzCar()def create_color(self):return RedColor()class BmwFactory(AbstractFactory): def create_car(self):return BmwCar()def create_color(self):return BlueColor()class AbstractCar:def drive(self):passclass BenzCar(AbstractCar):def drive(self):print("Driving Benz car")class BmwCar(AbstractCar): def drive(self):print("Driving BMW car")class AbstractColor:def color(self):passclass RedColor(AbstractColor): def color(self):print("Car color is red")class BlueColor(AbstractColor): def color(self):print("Car color is blue")def test(factory):car = factory.create_car()color = factory.create_color() car.drive()color.color()if __name__ == '__main__':test(BenzFactory())test(BmwFactory())```该示例代码中,我们定义了一个抽象工厂类`AbstractFactory`、两个具体工厂类`BenzFactory`、`BmwFactory`、一个抽象产品类`AbstractCar`、两个具体产品类`BenzCar`、`BmwCar`、一个抽象产品类`AbstractColor`、两个具体产品类`RedColor`、`BlueColor`。
抽象工厂模式介绍抽象工厂模式是一种软件设计模式,它提供了一种创建一系列相互关联或依赖的对象的方法,而无需指定具体实现类。
该模式的核心思想是将对象的创建和使用分离,从而在系统设计中提供更高的灵活性和可扩展性。
抽象工厂模式基于工厂方法模式,它将工厂抽象化,允许客户端使用抽象工厂来创建一系列相关或依赖的对象,而不必关心具体的实现类。
通过使用抽象工厂模式,我们可以使系统更易于扩展和修改,满足不同的需求和变化。
抽象工厂模式的结构包括抽象工厂、具体工厂、抽象产品和具体产品。
抽象工厂定义了创建一系列相关或依赖对象的方法,具体工厂实现了这些方法。
抽象产品定义了一系列相关产品的接口,具体产品实现了这些接口。
通过抽象工厂和具体产品的组合,我们可以创建一系列具有关联性的对象。
抽象工厂模式的使用可以带来多种好处。
首先,它可以提供系统的灵活性。
由于抽象工厂将对象的创建和使用分离,我们可以很容易地替换具体的工厂实现,从而满足不同的需求和变化。
其次,它可以提供系统的可扩展性。
通过增加新的具体工厂和产品实现,我们可以方便地扩展系统的功能。
再次,它可以提供系统的可维护性。
由于抽象工厂模式将创建对象的代码集中于一个工厂类中,我们可以更容易地维护和修改代码。
最后,它可以提供系统的解耦性。
客户端只需要与抽象工厂和抽象产品进行交互,不需要了解具体产品的实现细节,从而降低了系统的耦合度。
抽象工厂模式的应用场景较为广泛。
一种常见的应用场景是在需要创建一系列相互依赖的对象的时候。
比如,在一个图形界面应用程序中,需要创建一系列按钮和文本框,它们都依赖于同一个主题。
通过使用抽象工厂模式,我们可以创建具有相同主题的按钮和文本框,保持它们的外观风格一致。
另一个应用场景是在需要创建一系列相关产品族的时候。
比如,在一个汽车制造系统中,需要生产不同品牌和型号的汽车,每个品牌和型号都由相应的零部件组成。
通过使用抽象工厂模式,我们可以为每个品牌和型号创建对应的汽车工厂和零部件工厂,从而保证汽车的组装作业能够顺利进行。
第6章抽象工厂模式抽象工厂模式是一种创建型设计模式,旨在提供一个创建一系列相关或相互依赖对象的接口,而无需指定具体的类。
通过使用抽象工厂模式,可以使客户端与具体实例的创建分离,降低了客户端与具体实例之间的耦合度。
本文将详细介绍抽象工厂模式的定义、结构、应用场景以及优缺点。
一、定义抽象工厂模式,也称为Kit模式,是一种对象创建型模式。
它提供一个接口,用于创建一系列具有共同接口的相关或相互依赖的对象,而无需指定其具体实现类。
二、结构抽象工厂模式包含以下几个角色:1. 抽象工厂(Abstract Factory):定义了创建产品对象的接口,它包含了一组创建产品的方法。
2. 具体工厂(Concrete Factory):实现了抽象工厂中的方法,完成具体产品的创建。
3. 抽象产品(Abstract Product):定义了产品的接口,是具体产品类的父类。
4. 具体产品(Concrete Product):实现了抽象产品接口的具体产品类。
三、应用场景抽象工厂模式通常在以下几种情况下使用:1.系统需要一系列相关或相互依赖的对象,并且不希望客户端与具体实例之间有耦合。
2.客户端不应知道所使用的具体工厂和具体产品类的名称。
3.系统需要提供一种产品的多种实现,用户可以选择使用哪个实现。
四、优缺点抽象工厂模式具有以下优点:1.将具体产品的创建与使用解耦,客户端只需要知道使用抽象工厂即可。
2.通过切换具体工厂,可以改变系统的配置,实现不同产品簇的切换。
3.新增具体工厂和具体产品类只需实现对应的接口,符合开闭原则。
抽象工厂模式的缺点是:1.当产品簇需要新增产品时,需要修改所有的具体工厂类,不符合开闭原则。
2.当具体产品较多时,会导致具体工厂类的数量增加,难以管理。
五、代码示例我们以汽车和轮胎为例,介绍抽象工厂模式的代码实现。
首先,定义抽象工厂和抽象产品的接口:```java//抽象工厂public interface AbstractFactoryCar createCar(;Tire createTire(;//抽象产品public interface Carvoid drive(;//抽象产品public interface Tirevoid rotate(;```然后,实现具体工厂和具体产品的类:```java//具体工厂public class DomesticFactory implements AbstractFactory public Car createCareturn new DomesticCar(;}public Tire createTirreturn new DomesticTire(;}//具体工厂public class ForeignFactory implements AbstractFactory public Car createCareturn new ForeignCar(;}public Tire createTirreturn new ForeignTire(;}//具体产品public class DomesticCar implements Carpublic void drivSystem.out.println("国产汽车开始启动");}//具体产品public class ForeignCar implements Carpublic void drivSystem.out.println("进口汽车开始启动");}//具体产品public class DomesticTire implements Tire public void rotatSystem.out.println("国产轮胎开始旋转");}//具体产品public class ForeignTire implements Tirepublic void rotatSystem.out.println("进口轮胎开始旋转");}```最后,客户端通过具体工厂创建具体产品:```javapublic class Clientpublic static void main(String[] args) AbstractFactory factory = new DomesticFactory(; Car car = factory.createCar(;car.drive(;Tire tire = factory.createTire(;tire.rotate(;factory = new ForeignFactory(;car = factory.createCar(;car.drive(;tire = factory.createTire(;tire.rotate(;}```运行客户端代码输出:```国产汽车开始启动国产轮胎开始旋转进口汽车开始启动进口轮胎开始旋转```通过抽象工厂模式,客户端代码无需关注具体的产品类,只需要通过工厂创建产品即可。