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

      今天学习到抽象工厂模式,可以将它与工厂方法模式进行对比这样来学习:


    工厂方法模式:
    一个抽象产品类,可以派生出多个具体产品类。   
    一个抽象工厂类,可以派生出多个具体工厂类。   
    每个具体工厂类只能创建一个具体产品类的实例。


    抽象工厂模式:
    多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。   
    一个抽象工厂类,可以派生出多个具体工厂类。   
    每个具体工厂类可以创建多个具体产品类的实例。   
        
    区别:
    工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。   

    工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

      大话中通过访问不同的数据库SQL和Access明确的阐述了抽象工厂模式的意义:

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

       下面附加抽象工厂模式的基本代码:

      

    class Program
        {
            static void Main(string[] args)
            {
                AbstractFactory factory1 = new ConcreteFactory1();
                Client c1 = new Client(factory1);
                c1.Run();
    
                AbstractFactory factory2 = new ConcreteFactory2();
                Client c2 = new Client(factory2);
                c2.Run();
    
                Console.Read();
    
            }
        }
    
        abstract class AbstractFactory
        {
            public abstract AbstractProductA CreateProductA();
            public abstract AbstractProductB CreateProductB();
        }
    
        class ConcreteFactory1 : AbstractFactory
        {
            public override AbstractProductA CreateProductA()
            {
                return new ProductA1();
            }
            public override AbstractProductB CreateProductB()
            {
                return new ProductB1();
            }
        }
    
        class ConcreteFactory2 : AbstractFactory
        {
            public override AbstractProductA CreateProductA()
            {
                return new ProductA2();
            }
            public override AbstractProductB CreateProductB()
            {
                return new ProductB2();
            }
        }
        abstract class AbstractProductA
        {
        }
    
        abstract class AbstractProductB
        {
            public abstract void Interact(AbstractProductA a);
        }
    
        class ProductA1 : AbstractProductA
        {
        }
    
        class ProductB1 : AbstractProductB
        {
            public override void Interact(AbstractProductA a)
            {
                Console.WriteLine(this.GetType().Name +
                  " interacts with " + a.GetType().Name);
            }
        }
    
        class ProductA2 : AbstractProductA
        {
        }
    
        class ProductB2 : AbstractProductB
        {
            public override void Interact(AbstractProductA a)
            {
                Console.WriteLine(this.GetType().Name +
                  " interacts with " + a.GetType().Name);
            }
        }
    
        class Client
        {
            private AbstractProductA AbstractProductA;
            private AbstractProductB AbstractProductB;
    
            
            public Client(AbstractFactory factory)
            {
                AbstractProductB = factory.CreateProductB();
                AbstractProductA = factory.CreateProductA();
            }
    
            public void Run()
            {
                AbstractProductB.Interact(AbstractProductA);
            }
        }
       下面是抽象工厂模式的结构图:


      抽象工厂模式的优缺点:

      最大的优点便是易于交换产品系列,由于具体工厂类在一个应用中需要在初始化的时候出现一次,所以就使得改变一个应用的具体工厂变得非常容易,只需要改变具体工厂即可使用不同的产品配置。第二,能让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。

      编程是门艺术。。。。。。。

  • 相关阅读:
    SQL中distinct的用法
    python requests 高级用法 -- 包括SSL 证书错误的解决方案
    odoo js
    线程池的理解及使用
    单点登录原理及简单实现
    如何重写hashCode()和equals()方法
    多线程中的Lock小结
    Sql语句的优化摘要
    Spring事务管理
    并发编程之原子性、可见性、有序性的简单理解
  • 原文地址:https://www.cnblogs.com/xzpblog/p/5117992.html
Copyright © 2011-2022 走看看