zoukankan      html  css  js  c++  java
  • Head First设计模式之抽象工厂模式

    一、定义

    给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足一下条件:
         1)系统中有多个产品族,而系统一次只可能消费其中一族产品。 
         2)同属于同一个产品族的产品以其使用。 

    二、结构

    抽象工厂模式的各个角色(和工厂方法一样): 
         1)抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。 
         2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
         3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。
         4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。

    三、实现

    namespace DesignPatterns.AbstractFactory
    {
        class Program
        {
            static void Main(string[] args)
            {
                IAbstractFactory factory = null;
    
                factory = new XiaomiFactory();
                factory.ProductMobile();
                factory.ProductMp3();
    
                factory = new HuaweiFactory();
                factory.ProductMobile();
                factory.ProductMp3();
            }
        }
    
        public abstract class AbstractProduct
        {
    
        }
    
        public abstract class Mobile : AbstractProduct
        {
    
        }
        public class XiaomiMobile : Mobile
        {
    
        }
        public class HuaweiMobile : Mobile
        {
    
        }
        public abstract class Mp3 : AbstractProduct
        {
        }
        public class XiaomiMp3 : Mp3
        {
        }
        public class HuaweiMp3 : Mp3
        {
        }
    
        public interface IAbstractFactory
        {
            Mobile ProductMobile();
            Mp3 ProductMp3();
        }
    
        public class XiaomiFactory : IAbstractFactory
        {
            public Mobile ProductMobile()
            {
                Console.WriteLine("生产小米手机.");
                return new XiaomiMobile();
            }
    
            public Mp3 ProductMp3()
            {
                Console.WriteLine("生产小米MP3.");
                return new XiaomiMp3();
            }
        }
    
        public class HuaweiFactory : IAbstractFactory
        {
            public Mobile ProductMobile()
            {
                Console.WriteLine("生产华为手机.");
                return new HuaweiMobile();
            }
    
            public Mp3 ProductMp3()
            {
                Console.WriteLine("生产华为MP3.");
                return new HuaweiMp3();
            }
        }
    }

    四、适用场景

      1、QQ 换皮肤,一整套一起换。

      2、生成不同操作系统的程序。

    五、优缺点

    优点:

    抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建。

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

    增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。

    缺点:

    增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性

    欢迎阅读本系列文章:Head First设计模式之目录

  • 相关阅读:
    javascript预编译练习(变态篇)
    javascript预编译
    原码、反码、补码 详解
    Ubuntu 16.04安装anaconda3
    html+css实现奥运五环(环环相扣)
    jquery实现分页效果
    Centos6.5修改mysql登陆用户密码
    2020/5/29 JS中的循环和函数
    2020/5/27 JS 循环语句
    2020/5/26 JS
  • 原文地址:https://www.cnblogs.com/xcsn/p/7302538.html
Copyright © 2011-2022 走看看