抽象工厂模式笔记

定义

之前已经写过工厂方法模式,其可以将创建对象的代码集中在一个对象或方法中,当增加产品时,只需要增加对应的产品和工厂类即可。但是其有一个问题是工厂的接口里只有一个创建抽象产品的方法,当我们想要在一个工厂里创建一系列的产品时,就需要使用抽象工厂模式。

使用

图看起来可能有点容易乱,其实主要有三个接口,两个产品的接口,每个产品接口有多个实现类

同时有一个工厂类,工厂类中可以生成每种产品接口的一个实现类。

代码(Java)

产品组部分的代码如下:

// A产品接口
public interface ProductA {
    void method();
}
?
// A产品实现类A1
public class ProductA1 implements ProductA {
    @Override
    public void method() {
        System.out.println("This is ProductA1");
    }
}
?
// A产品实现类A2
public class ProductA2 implements ProductA {
    @Override
    public void method() {
        System.out.println("This is ProductA2");
    }
}
?
// B产品接口
public interface ProductB {
    void method();
}
?
// B产品实现类B1
public class ProductB1 implements ProductB {
    @Override
    public void method() {
        System.out.println("This is productB1");
    }
}
?
// B产品实现类B2
public class ProductB2 implements ProductB {
    @Override
    public void method() {
        System.out.println("This is productB2");
    }
}

工厂相关代码:

// 抽象工厂接口
public interface Factory {
    // 生成A类产品
    ProductA createProductA();
    // 生成B类产品
    ProductB createProductB();
}
?
// 抽象工厂实现类1,生产ProductA1和ProductB1
public class ConcreteFactory1 implements Factory {
    @Override
    public ProductA createProductA() {
        return new ProductA1();
    }
?
    @Override
    public ProductB createProductB() {
        return new ProductB1();
    }
}
?
// 抽象工厂实现类2,生产ProductA2和ProductB2
public class ConcreteFactory2 implements Factory {
    @Override
    public ProductA createProductA() {
        return new ProductA2();
    }
?
    @Override
    public ProductB createProductB() {
        return new ProductB2();
    }
}

测试类如下:

public class Test {
    public static void main(String[] args) {
        Factory factory = new ConcreteFactory1(); // 使用具体工厂1
        ProductA productA = factory.createProductA();
        ProductB productB = factory.createProductB();
        productA.method(); // 输出:This is ProductA1
        productB.method(); // 输出:This is productB1
?
        factory = new ConcreteFactory2(); // 切换工厂,使用具体工厂2
        productA = factory.createProductA();
        productB = factory.createProductB();
        productA.method(); // 输出:This is ProductA2
        productB.method(); // 输出:This is productB2
    }
}

总结

抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

有一个工厂抽象类或接口,多种产品抽象类或接口,每个具体工厂子类可以创建多种产品类。

时间: 2024-07-30 17:28:14

抽象工厂模式笔记的相关文章

易学设计模式看书笔记(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

java/android 设计模式学习笔记(4)---抽象工厂模式

再来介绍一下抽象工厂模式(Abstact Factory Pattern),也是创建型模式之一,上篇博客主要介绍了工厂方法模式.抽象工厂模式和工厂方法模式稍有区别.工厂方法模式中工厂类生产出来的产品都是具体的,也就是说每个工厂都会生产某一种具体的产品,但是如果工厂类中所生产出来的产品是多种多样的,工厂方法模式也就不再适用了,就要使用抽象工厂模式了. 抽象工厂模式的起源或者最早的应用,是对不同操作系统的图形化解决方案,比如在不同操作系统中的按钮和文字框的不同处理,展示效果也不一样,对于每一个操作系

《Head First 设计模式》学习笔记——工厂模式 + 抽象工厂模式

设计模式 工厂模式:定义一个创建对象的接口,但由子类决定要实例化的是哪一个.工厂方法让类把实例化推迟到子类. 所谓的"决定",并非指模式同意子类本身在执行时做决定,而是指在编写创建者类时.不须要知道实际创建的产品是哪一个. 选择了使用这个子类,就自然的决定了实际创建的产品是什么. 抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族.而不须要指定详细类. 抽象工厂的任务时定义一个负责创建一组产品的接口.这个接口内的每一个产品都负责创建一个详细产品.使用工厂方法. 设计原则 (1)多

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

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

设计模式学习笔记(十一:抽象工厂模式)

1.1概述 提供一个创建一系列或相互依赖对象的接口,而无须指定他们具体的类.这就是抽象工厂模式的定义. 设计某些系统时可能需要为用户提供一系列相关的对象,但系统不希望用户直接使用new运算符实例化这些对象,而是应当由系统来控制这些对象的创建,否则用户不仅要清楚地知道使用哪些类来创建这些对象,而且还必须要清楚对象之间是如何关联的,使得用户的代码和这些类形成紧耦合.缺乏弹性.不利于维护. 例如,军队要为士兵(用户)提供机关枪.手枪以及相应的子弹,但军队系统不希望由士兵提供来生产机关枪.手枪以及子弹,

设计模式笔记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

笔记-大话设计模式-15 抽象工厂模式

抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 所有在用简单工厂的地方,都可以考虑用反射技术来去除switch或if,解除分支判断带来的耦合. Demo: interface IUser { void Insert(User user); User GetUser(int id); } class User { private int _id; public int Id { get { return _id; } set

笔记十三:设计模式之简单工厂模式、工厂方法模式、抽象工厂模式

引言: 假设现在有一个超市(Market),超市销售饼干(Biscuit).水果(Fruit).饮料(Drink)三种食品. 按照常规,我们建立三个类:class Biscuit.class Fruit.class Drink. class Biscuit{ public: Biscuit(){} ~Biscuit(){} void Show(){ cout << "Hi,customers! I'm Biscuit!" << endl; } }; class

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

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