惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

M
MIT News - Artificial intelligence
有赞技术团队
有赞技术团队
S
Schneier on Security
aimingoo的专栏
aimingoo的专栏
T
Troy Hunt's Blog
U
Unit 42
Hacker News - Newest:
Hacker News - Newest: "LLM"
V2EX - 技术
V2EX - 技术
T
The Blog of Author Tim Ferriss
V
Visual Studio Blog
H
Heimdal Security Blog
H
Hacker News: Front Page
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Cloudbric
Cloudbric
Google DeepMind News
Google DeepMind News
C
Cisco Blogs
The Cloudflare Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
MyScale Blog
MyScale Blog
F
Fortinet All Blogs
N
News | PayPal Newsroom
Attack and Defense Labs
Attack and Defense Labs
D
DataBreaches.Net
N
News and Events Feed by Topic
Security Archives - TechRepublic
Security Archives - TechRepublic
Forbes - Security
Forbes - Security
Simon Willison's Weblog
Simon Willison's Weblog
F
Full Disclosure
The Register - Security
The Register - Security
L
LINUX DO - 热门话题
Webroot Blog
Webroot Blog
Google Online Security Blog
Google Online Security Blog
AI
AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
I
Intezer
S
Security Affairs
阮一峰的网络日志
阮一峰的网络日志
K
Kaspersky official blog
云风的 BLOG
云风的 BLOG
博客园 - 叶小钗
T
Threatpost
Spread Privacy
Spread Privacy
小众软件
小众软件
AWS News Blog
AWS News Blog
S
Secure Thoughts
S
Security @ Cisco Blogs
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
J
Java Code Geeks

博客园 - 青玄鸟

.NET 中优雅处理 Server-Sent Events 请求取消 vue3.0 + ts 实现上传工厂(oss与cos) Dapr 订阅者参数无法正确反序列化问题 .NET 代码整洁手册 Blazor项目通过docker和nginx部署为静态站点的步骤 Moq mock 方法返回null空指针异常 基于接口隔离原则的依赖注入实现 HttpClient with Stream HttpClient partial update HttpClient 基本使用 值对象的封装 只读集合类型属性实现 适配器模式 模板模式 最少知识原则 单例模式 简单工厂、工厂方法、抽象工厂 工厂方法模式 使用 Visual Studio Code创建和执行T-SQL
抽象工厂
青玄鸟 · 2020-03-30 · via 博客园 - 青玄鸟

定义

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

UML类图

实现

案例:提供一个创建手机的应用,根据不同的配件类型,生产不同类型的手机(安卓/iPhone)

定义接口

抽象工厂

    public interface MobileFactory
    {
        // 创建CPU
        ACPU CreateCPU();
        // 创建主板
        AMainboard CreateMainboard();
        // 创建外壳
        AShell CreateShell();
    }

CPU

    public abstract class ACPU
    {
        protected string version;

        protected string name;

        public string Version { get => version; }

        public string Name { get => name; }
    }

主板

    public abstract class AMainboard
    {
        protected string name;

        public string Name { get => name;}

    }

外壳

    public abstract class AShell
    {
        protected double screenSize;
        protected string color;
        public double ScreenSize { get=> screenSize; }
        public string Color { get => color; }
    }

具体工厂类

安卓工厂

    public class AndroidFactory : MobileFactory
    {
        public ACPU CreateCPU()
        {
            return new AndroidCPU();
        }

        public AMainboard CreateMainboard()
        {
            return new AndroidMainBoard();
        }

        public AShell CreateShell()
        {
            return new AndroidShell();
        }
    }

IOS工厂

   public class IOSFactory : MobileFactory
    {
        public ACPU CreateCPU()
        {
            return new IOSCPU();
        }

        public AMainboard CreateMainboard()
        {
            return new IOSMainboard();
        }

        public AShell CreateShell()
        {
            return new IOSShell();
        }
    } 

具体零件类(Member)

安卓

    public class AndroidCPU:ACPU
    {
        public AndroidCPU()
        {
            this.name = "Qualcomm";
            this.version = "860";
        }
    }
    public class AndroidMainBoard:AMainboard
    {
        public AndroidMainBoard()
        {
            name = "mainboard for android";
        }
    }
    public class AndroidShell:AShell
    {
        public AndroidShell()
        {
            screenSize = 6.0;
            color = "black";
        }
    }

IOS

    public class IOSCPU:ACPU
    {
        public IOSCPU()
        {
            name = "A";
            version = "13";
        }
    }
    public class IOSMainboard:AMainboard
    {
        public IOSMainboard()
        {
            name = "mainboard for ios";
        }
    }
    public class IOSShell:AShell
    {
        public IOSShell()
        {
            screenSize = 4.7;
            color = "red";
        }
    }

Client

    public class Mobile
    {
        ACPU cpu;
        AMainboard mainboard;
        AShell shell;
        MobileFactory mobileFactory;
        public Mobile(MobileFactory mobileFactory)
        {
            this.mobileFactory = mobileFactory;
        }

        public void Create()
        {
            cpu = mobileFactory.CreateCPU();
            mainboard = mobileFactory.CreateMainboard();
            shell = mobileFactory.CreateShell();

            Console.WriteLine($"The mobile is created,with cpu:{cpu.Name+cpu.Version},mainboard:{mainboard.Name},outshell:{shell.ScreenSize},{shell.Color}");
        }
    }

测试

    class Program
    {
        static void Main(string[] args)
        {
            MobileFactory mobileFactory = new AndroidFactory();
            Mobile android = new Mobile(mobileFactory);
            android.Create();

            mobileFactory = new IOSFactory();
            Mobile iphone = new Mobile(mobileFactory);
            iphone.Create();

            Console.ReadLine();
        }
    }

运行结果

The mobile is created,with cpu:Qualcomm860,mainboard:mainboard for android,outshell:6,black
The mobile is created,with cpu:A13,mainboard:mainboard for ios,outshell:4.7,red