【设计模式学习笔记】 之 抽象工厂模式

简介:

抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

举例:每个汽车4s店和某个品牌工厂之间的关系,每个汽车4s店只会卖同一品牌的汽车,但是如果这一品牌汽车销量不好,效益不佳,那么4s店可以更换进货的工厂,从而更换其售卖的品牌。

分析:每个品牌的汽车都有一个品牌工厂,这些工厂都有一个生产汽车的方法,4s店中应持有工厂的引用,所以这些汽车工厂都应该实现一个汽车工厂接口,这个4s店中持有汽车工厂的接口,以便更换汽车工厂改变品牌。

实现:

汽车工厂是用来生产汽车的,所以首先应该有一个汽车接口,所有汽车都有一个run方法

1 package com.mi.abstractfactory;
2
3 public interface Car {
4
5     void run();
6 }

实现这个接口创建一款汽车

package com.mi.abstractfactory;

/**
 * 沃尔沃汽车
 */
public class VolvoCar implements Car{

    @Override
    public void run() {
        System.out.println("沃尔沃:别赶路,去感受路!");
    }

}

有了汽车类了,这样就可以使用工厂来批量生产了,创建一个汽车工厂接口,其中包含一个生产汽车的方法

 1 package com.mi.abstractfactory;
 2
 3 /**
 4  * 汽车工厂接口
 5  * @author hellxz
 6  */
 7 public interface AbstractCarFactory {
 8
 9     //接口中所有的没有使用权限修饰符的方法,都是public static final的
10     Car getCar();
11 }

2.实现一个品牌汽车工厂

 1 package com.mi.abstractfactory;
 2 /**
 3  * 沃尔沃汽车工厂
 4  */
 5 public class VolvoCarFactory implements AbstractCarFactory {
 6
 7     @Override
 8     public VolvoCar getCar() {
 9         return new VolvoCar();
10     }
11
12 }

3.创建一个汽车4s店,这个店铺需要有一个卖车的方法saleCar(),并持有一个工厂的引用

 1 package com.mi.abstractfactory;
 2
 3 public class SSSS {
 4
 5     /**
 6      * 实现抽象工厂对象的 注入有两种方式,一种是set设值注入,构造方法,都持有接口的引用
 7      */
 8     //持有引用,可以根据多态性,传入该接口的实现类型,从而实现不同的效果
 9     private AbstractCarFactory carFactory;
10
11     public Car saleCar() {
12         return carFactory.getCar(); //抽象工厂获取方式得到car对象,可以是car的子类,多态
13     }
14
15     public void setCarFactory(AbstractCarFactory carFactory) {
16         this.carFactory = carFactory;
17     }
18
19 }

为了能看出来更换工厂的效果,同理创建一个Benz汽车的类和工厂

 1 package com.mi.abstractfactory;
 2
 3 /**
 4  * 奔驰汽车
 5  * @author hellxz
 6  */
 7 public class BenzCar implements Car {
 8
 9     @Override
10     public void run() {
11         System.out.println("奔驰:随时准备好上路疾驶!");
12     }
13
14 }
 1 package com.mi.abstractfactory;
 2
 3 /**
 4  * 奔驰汽车工厂
 5  * @author hellxz
 6  */
 7 public class BenzCarFactory implements AbstractCarFactory {
 8
 9     @Override
10     public BenzCar getCar() {
11         return new BenzCar();
12     }
13
14     // 也可以这样写,返回父类的引用,因为多态(动态绑定),在运行的时候会确定该类型 的具体类型
15     /*    public Car getCar() {
16      *        return new BenzCar();
17      *    }
18      */
19
20 }

测试类

 1 package com.mi.abstractfactory;
 2
 3 /**
 4  * @author hellxz
 5  */
 6 public class Test {
 7
 8     public static void main(String[] args) {
 9         SSSS ssss = new SSSS();
10 //        ssss.setCarFactory(new BenzCarFactory()); //奔驰的工厂
11         ssss.setCarFactory(new VolvoCarFactory()); //沃尔沃的工厂
12         Car car = ssss.saleCar();
13         car.run();
14     }
15 }

输出:

沃尔沃:别赶路,去感受路!

测试更换工厂,打开注释行,注释掉沃尔沃的工厂行

输出:

奔驰:随时准备好上路疾驶!

总结:

主要解决:主要解决接口选择的问题。

何时使用:一个系统中有多个系列可选择的情况,每次只能选择其中一系列

优点:

  1. 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
  2. 降低耦合

缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 接口 里加代码,又要在具体的里面加代码。

使用场景: 1、更换一整套的产品  2、生成不同操作系统的程序。

原文地址:https://www.cnblogs.com/hellxz/p/8449522.html

时间: 2024-11-08 22:42:58

【设计模式学习笔记】 之 抽象工厂模式的相关文章

菜鸟学设计模式系列笔记之抽象工厂模式

抽象工厂模式(Abstract Factory模式): (1)Intent:提供一个创建一系列相关后相互依赖对象的接口,而无需指定它们具体的类-客户端不必指定产品的具体类型,创建多个产品族中的产品对象 (2)Motivation :为保证视感风格标准间的可移植性,应用不应该为一个特定的视感外观硬编码它的窗口组件.在整个应用中实例化特定的视感风格的窗口组建类将使得使得以后很难改变视感的风格. 抽闲工厂模式面对的是多个产品等级结构的系统设计. 工厂方法模式针对的是一个产品等级结构: 抽象工厂模式需要

易学设计模式看书笔记(4) - 抽象工厂模式

 本文内容来自书上,不懂设计模式,只求混个眼熟. 三.抽象工厂模式 1.动物管理系统的例子 public interface Animal{ public void eat(); } public class Tiger implements Animal { public void eat(){ sysout.out.println("老虎会吃"); }; public void run(){ sysout.out.println("老虎会跑"); }; } pu

PHP设计模式学习笔记: 责任链模式(Chain of Responsibility)

// 抽象书本类 abstract class AbstractBookTopic { abstract function getTopic(); abstract function getTitle(); abstract function setTitle($title_in); } // 书本类,继承自抽象书本类 class BookTopic extends AbstractBookTopic { private $topic; private $title; function __co

设计模式(3)--抽象工厂模式(Absrtact Factory Pattern)

定义 抽象工厂模式的实质就是提供接口来创建一系列相关或独立的对象而不指定这些对象的具体类. 理解 在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(熟悉的new操作符),提供一种"封装机制"来避免客户程序和这种"多系列具体对象创建工作"的紧耦合?这就是我们要说的抽象工厂模式.抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂

大话设计模式读书笔记1——简单工厂模式

最近几日,重温了一下<大话设计模式>这本书,当时读的仓促,有很多没有注意的地方,现在仔细翻看起来,发现这值得细细品味的一本书!! 好东西就要记下来!!! 第一章笔记:从一个简单的计算器程序来看简单工厂模式. 变化的地方就要封装,用一个单独的类来做创造实例的过程这就是工厂. UML图: /// <summary> /// 运算类 /// </summary> public class Operation { public double Number1 { get; set

设计模式(三)——抽象工厂模式

设计模式(三)--抽象工厂模式 一.抽象工厂模式 1.抽象工厂模式简介 定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. UML类图: 2.抽象工厂模式角色 (1)抽象工厂AbstractFactory:抽象工厂类,提供创建两种产品的接口CreateProductA和CreateProductB,由派生的各个具体工厂类对其实现 (2)具体工厂:包括具体工厂FactoryM和具体工厂FactoryN.具体工厂FactoryM用于生产具体产品MProductA和具体产品M

设计模式那点事读书笔记(2)----抽象工厂模式

抽象工厂模式: 此模式提供了一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体实现类. 解决什么问题: 抽象工厂模式允许客户在使用抽象接口来创建一组相关的产品,客户类和工厂类分开,客户需要任何产品的时候,只需要向工厂请求即可,客户无须修改就可以获得新产品.从而实现客户从具体的产品中解耦. UML: 代码结构: 代码: 定义抽象产品: package com.demo.factory.model; /** * 抽象产品 */ public abstract class AbstractBa

设计模式笔记10: 抽象工厂模式

1.1 定义 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. 1.2 类图 1.3 代码实现 1 using System; 2 using System.Collections.Generic; 3 using System.Configuration; 4 using System.Linq; 5 using System.Reflection; 6 using System.Text; 7 using System.Threading.Tasks; 8 9 names

设计模式(3)抽象工厂模式(Abstract Factory)

设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 设计模式(2)工厂方法模式(Factory Method) 源码地址 0 抽象工厂模式简介 0.0 抽象工厂模式定义 抽象工厂模式一般的书面定义为:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类 提供创建接口,无需指定具体实现类,这个原则在简单工厂模式和工厂方法模式篇已经反复讲到了,这是面向接口编程的一个基本准则,很显然,从抽象工厂模式的一般定义中可以看出这也是抽象工厂模式的一个核心,而抽象工厂模式的另

设计模式之创建型抽象工厂模式

通过对类的工厂抽象使其业务用于对产品类簇的创建,而不负责某一类产品的实例.抽象类是一种声明但不能使用的类,当你使用的时候就会报错.JavaScript中的抽象类不能像传统面向对象语言那样轻松地创建,我们可以在类的方法中手动抛出错误来模拟抽象类.你可能会想,这样的类什么都不能做有什么用?其实它在继承上是很有用的.抽象工厂模式不能用来创建具体对象,一般用它作为父类创建一些子类. // 抽象工厂方法 var PageFactory = function(parent, child) { // 判断抽象