zoukankan      html  css  js  c++  java
  • 【设计模式】抽象工厂模式

    定义


    为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类

    抽象工厂是工厂方法的升级版,处理的多个产品,若只有一个产品,变化成工厂方法

    优缺点


    • 优点
    1. 高层模块不依赖具体实现,依赖是抽象类/接口
    2. 封装性,具体构造都封装在具体实现工厂,高层模块不需要知道如何创建
    3. 产品等级容易扩展(例如条件一个小米手机,只需要添加XiaoMiFactory和具体相应的产品族)
    • 缺点
    1. 产品族扩展非常困难(例如需要添加RAM,抽象工厂,所有实现工厂都需要修改,违反开闭原则)

    角色


    • 客户端 --> 抽象工厂,具体工厂, 抽象产品
    • 抽象产品 --> 具体产品
    • 具体产品
    • 抽象工厂 --> 抽象产品
    • 具体工厂 --> 抽象产品,具体产品

    代码


    • 抽象产品
    public abstract class Screen
    {
        public abstract void Show();
    }
    
    public abstract class CPU
    {
        public abstract void Show();
    }
    
    • 具体产品
    public class SamsungScreen : PhoneAbstract.Screen
    {
        public override void Show()
        {
            System.Console.WriteLine("使用三星屏幕");
        }
    }
    
    public class LGScreen : PhoneAbstract.Screen
    {
        public override void Show()
        {
            System.Console.WriteLine("使用LG屏幕");
        }
    }
    
    • 抽象工厂
    public abstract class PhoneFactory
    {
        public abstract PhoneAbstract.Screen GetScreen();
    
        public abstract PhoneAbstract.CPU GetCPU();
    }
    
    • 具体工厂
    public class IPhoneFactory : PhoneFactory
    {
        public override CPU GetCPU()
        {
            return new Phone.ASeriesCPU();
        }
    
        public override Screen GetScreen()
        {
            return new Phone.SamsungScreen();
        }
    }
    
    public class HWPhoneFactory : PhoneFactory
    {
        public override CPU GetCPU()
        {
            return new Phone.KirinCPU();
        }
    
        public override Screen GetScreen()
        {
            return new Phone.LGScreen();
        }
    }
    
    • 客户端
    Console.WriteLine("--------  IPhone 手机  --------");
    var iphoneFactory = new Factory.IPhoneFactory();
    iphoneFactory.GetScreen().Show();
    iphoneFactory.GetCPU().Show();
    
    Console.WriteLine(Environment.NewLine + "--------  HUAWEI 手机  --------");
    var hwFactory = new Factory.HWPhoneFactory();
    hwFactory.GetScreen().Show();
    hwFactory.GetCPU().Show();
    

    总结

    抽象工厂是工厂方法的升级版,适合一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式


    示例代码 - Github

  • 相关阅读:
    2017中国大学生程序设计竞赛
    2017中国大学生程序设计竞赛
    2017中国大学生程序设计竞赛
    2017中国大学生程序设计竞赛
    计算几何之凸包模板
    计算几何之凸包模板
    Kafka知识点汇总
    python 爬虫1 開始,先拿新浪微博開始
    iOS 7的手势滑动返回
    Ctrl+Enter 选中文本提交
  • 原文地址:https://www.cnblogs.com/WilsonPan/p/12840667.html
Copyright © 2011-2022 走看看