jjzjj

再有人问你抽象工厂设计模式,把这篇文章丢给他

realyrare 2023-03-28 原文

概述

抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一组产品。抽象工厂模式定义如下:

抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。

描述需求

分别往SQLserver、mysql、sqliter数据库中添加用户和部门数据。

抽象工厂实现代码

   /// <summary>
    /// 顶层抽象工厂
    /// </summary>
    public interface IFacatory
    {
        IDatabaseUser GetDatabaseUser();
        IDatabaseDepartment GetDatabaseDepartment();
    }
    /// <summary>
    /// 具体工厂
    /// </summary>
    public class SqlliteFacatory : IFacatory
    {
        public IDatabaseDepartment GetDatabaseDepartment()
        {
            return  new SqlliteDepartment();
        }
        public IDatabaseUser GetDatabaseUser()
        {
            return new SqliteUser();
        }
    }
    /// <summary>
    /// 具体工厂
    /// </summary>
    public class MysqlFacatory : IFacatory
    {
        public IDatabaseDepartment GetDatabaseDepartment()
        {
            return new MysqlDepartment();
        }
        public IDatabaseUser GetDatabaseUser()
        {
            return new MysqlUser();
        }
    }
    /// <summary>
    /// 具体工厂
    /// </summary>
    public class SqlserverFacatory : IFacatory
    {
        public IDatabaseDepartment GetDatabaseDepartment()
        {
            return new SqlServerDepartment();
        }
        public IDatabaseUser GetDatabaseUser()
        {
            return new SqlServerUser();
        }
    }
    /// <summary>
    /// 用户类
    /// </summary>
    public class User
    {
        public string  Name { get; set; }
        public int Id { get; set; }
    }
    /// <summary>
    /// 抽象的产品
    /// </summary>
    public interface IDatabaseUser
    {
        void InsertUser(User user);
        User GetUser(int id);
    }
    /// <summary>
    /// 具体的产品
    /// </summary>
    public class SqlServerUser: IDatabaseUser
    {
        public void InsertUser(User user)
        {
            Console.WriteLine($"插入了SqlServerUser:{user.Name}");
        }
        public User GetUser(int id)
        {
            Console.WriteLine($"获取了Id:{id}的用户");
            return null;
        }
    }
    /// <summary>
    /// 具体的产品
    /// </summary>
    public class MysqlUser : IDatabaseUser
    {
        public void InsertUser(User user)
        {
            Console.WriteLine($"插入了MysqlUser:{user.Name}");
        }
        public User GetUser(int id)
        {
            Console.WriteLine($"获取了Id:{id}的用户");
            return null;
        }
    }
    /// <summary>
    /// 具体的产品
    /// </summary>
    public class SqliteUser : IDatabaseUser
    {
        public void InsertUser(User user)
        {
            Console.WriteLine($"插入了SqliteUser:{user.Name}");
        }
        public User GetUser(int id)
        {
            Console.WriteLine($"获取了Id:{id}的用户");
            return null;
        }
    }
   /// <summary>
    /// 部门类
    /// </summary>
    public class Department
    {
        public string Name { get; set; }
        public int Id { get; set; }
    }
    /// <summary>
    /// 抽象的产品
    /// </summary>
    public interface IDatabaseDepartment
    {
        void InsertDepartment(Department department);
        Department GetDepartment(int id);
    }
    /// <summary>
    /// 具体的产品
    /// </summary>
    public class SqlServerDepartment : IDatabaseDepartment
    {
        public void InsertDepartment(Department  department)
        {
            Console.WriteLine($"插入了SqlServerDepartment部门:{department.Name}");
        }
        public Department GetDepartment(int id)
        {
            Console.WriteLine($"获取了Id:{id}的部门");
            return null;
        }
    }
    /// <summary>
    /// 具体的产品
    /// </summary>
    public class MysqlDepartment : IDatabaseDepartment
    {
        public void InsertDepartment(Department department)
        {
            Console.WriteLine($"插入了MysqlDepartment部门:{department.Name}");
        }
        public Department GetDepartment(int id)
        {
            Console.WriteLine($"获取了Id:{id}的部门");
            return null;
        }
    }
    /// <summary>
    /// 具体的产品
    /// </summary>
    public class SqlliteDepartment : IDatabaseDepartment
    {
        public void InsertDepartment(Department department)
        {
            Console.WriteLine($"插入了SqlliteDepartment部门:{department.Name}");
        }
        public Department GetDepartment(int id)
        {
            Console.WriteLine($"获取了Id:{id}的部门");
            return null;
        }
    }
//C#控制台调用
Console.WriteLine("抽象工厂");
User user = new();
user.Name = "mhg";
user.Id = 1;
//变化点
IFacatory facatory=new SqlserverFacatory(); //MysqlFacatory //SqlliteFacatory
IDatabaseUser databaseUser = facatory.GetDatabaseUser();
databaseUser.InsertUser(user);
databaseUser?.GetUser(user.Id);
Department department = new Department();
department.Name = "研发部";
department.Id = 2;
IDatabaseDepartment databaseDepartment=  facatory.GetDatabaseDepartment();
databaseDepartment.InsertDepartment(department);    
databaseDepartment?.GetDepartment(department.Id);

以上就用抽象工厂实现的全部代码,该代码中IFacatory做为抽象工厂,SqlserverFacatory、MysqlFacatory、SqliteFacatory作为具体的产品工厂来生产产品;IDatabaseUser和IDatabaseDepartment为抽象的产品分别生产具体的产品SqlServerUser、MysqlUser、SqliteUser和SqlServerDepartment、MysqlDepartment、SqlliteDepartment。

总结

这个需求也可以用工厂模式实现,但每增加一个产品,就必须增加一个工厂类,而用抽象工厂可以缩减创建子类工厂的数量,不必给每一个产品增加工厂类,可以对产品进行分组,每组中的不同产品由同一个工厂类的不同方法来创建。

有关再有人问你抽象工厂设计模式,把这篇文章丢给他的更多相关文章

  1. ruby-on-rails - Railstutorial : db:populate vs. 工厂女孩 - 2

    在railstutorial中,作者为什么选择使用这个(代码list10.25):http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-usersnamespace:dbdodesc"Filldatabasewithsampledata"task:populate=>:environmentdoRake::Task['db:reset'].invokeUser.create!(:name=>"ExampleUser",:email=>"example@railstutorial.org",:passwo

  2. ruby-on-rails - 工厂女孩/Rails : Generator to create a factory for existing model? - 2

    我在我的Rails项目中使用rspec_rails和factory_girl_railsgem。所有模型都已创建。是否有我可以运行的生成器来为现有模型创建工厂文件?例如:我已经有了一个Blog模型。RSpec允许我通过简单地运行以下命令在spec/models/blog_spec.rb生成一个模型规范文件:railsgeneraterspec:modelblog是否有我可以在命令行中运行的生成器,它会为这个现有模型生成工厂文件,位于:spec/factories/blogs.rb?我在factory_girl_rails中没有看到任何关于发电机的提及文档。

  3. ruby-on-rails - 我如何在 FactoryGirl 中为循环关联创建工厂? - 2

    我在尝试为我在项目中定义的某些对象和关联创建工厂时遇到了问题。我有一种循环关联,其中一个对象与另外两个随后连接在一起的对象关联。+--------------++-------------+|||||TestCase+--------->|TestDataGrid|||||+------+-------++------+------+||||||vv+--------------++--------------+|||||||||TestVariable||TestDataSet|||||+------+-------++------+-------+|||||||||+-------

  4. ruby-on-rails - Rails 3.1,工厂女孩错误 - 2

    已修复。Rails中有一个错误。参见https://github.com/rails/rails/issues/2333我对FactoryGirlRails和Rails3.1.0.rc5有疑问当我多次执行user=FactoryGirl.create(:user)时出现错误。Failure/Error:user=FactoryGirl.create(:user)NameError:uninitializedconstantUser::User#./app/models/user.rb:17:in`generate_token'#./app/models/user.rb:4:in`blo

  5. ruby-on-rails - FactoryGirl工厂特征内的序列不使用主序列计数器 - 2

    我有以下工厂:FactoryGirl.definedofactory:foodosequence(:name){|n|"Foo#{n}"}trait:ydosequence(:name){|n|"Fooy#{n}"}endendend如果我跑create:foocreate:foocreate:foo,:y我得到Foo1,Foo2,Fooy1。但我想要Foo1,Foo2,Fooy3。我怎样才能做到这一点? 最佳答案 经过smile2day'sanswer的一些提示后和thisanswer,我得出以下解决方案:FactoryGirl.

  6. ruby-on-rails - rails delete_if 使用哈希忽略当前文章(中间人) - 2

    我为你们准备了一个简单的。我想要一个特色内容部分,其中排除了当前文章所以这可以通过delete_if使用MiddlemanBlog:但是我使用的是中间人代理,所以我无法访问current_article方法...我有一个YAML结构,其中包含以下模拟数据(以及其他数据),文件夹设置如下:data>site>caseStudy>RANDOM-ID423536.yaml(由CMS生成)在每个yaml文件中,您会发现如下内容::id:2k1YccJrQsKE2siSO6o6ac:title:Heyplace我的config.rb看起来像这样data.site.caseStudy.eachdo

  7. python - Ruby 是否有相当于 Python 的扭曲框架作为网络抽象层? - 2

    据我了解,Python的扭曲框架为网络通信提供了更高级别的抽象(?)。我正在寻找在Rails应用程序中使用与twisted等效的Ruby。 最佳答案 看看EventMachine.它不像Twisted那样广泛,但它是围绕事件驱动网络编程的相同概念构建的。 关于python-Ruby是否有相当于Python的扭曲框架作为网络抽象层?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/9

  8. ruby-on-rails - 之前的工厂女孩​​(:create) callback not creating associations - 2

    我有一个FactoryGirl工厂,它创建一个Order但before(:create)回调不会创建关联的工厂对象:父类classOrder子类classOrderLine工厂Factory:orderdo...ignoredonumber_or_order_lines1endbefore(:create)do|order,evaluator|FactoryGirl.create_list:order_line,evaluator.number_or_order_lines,order:orderendendFactory:order_linedoassociation:userass

  9. ruby - ruby 中的过程和数据抽象 - 2

    我是Ruby新手。我正在学习ruby​​中的抽象原则。据我了解,过程抽象是对用户隐藏实现细节,或者只是专注于要点而忽略细节。我关心的是如何实现它1)是不是一个简单的函数调用就这样#functiontosortarray#@paramsarray[Array]tobesortdefmy_sort(array)returnarrayifarray.sizearray[i+1]array[i],array[i+1]=array[i+1],array[i]swapped=trueendendendarrayend然后这样调用sorted_array=my_sort([12,34,123,43,

  10. ruby - 在 Middleman 中移动博客文章位置 - 2

    我正在为我的网站使用MiddlemanBloggem,但默认情况下,博客文章似乎需要位于/source中,这在查看vim中的树时并不是特别好并尝试在其中找到其他文件之一(例如模板)。通过查看文档,我看不出是否有任何方法可以移动博客文章,以便将它们存储在其他地方,例如blog_articles文件夹或类似文件夹。这可能吗? 最佳答案 将以下内容放入您的config.rb文件中。activate:blogdo|blog|blog.permalink=":year-:month-:day-:title.html"blog.sources=

随机推荐