• 设计模式——6.工厂方法


    工厂方法(Factory Method)

    Factory Method模式简介:

    定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

    Factory Method模式结构:

    FactoryMethod

    C++代码

    Product抽象类以及ConcreteProduct具体实现类:

    //file: Product.h
    #pragma once
    class Product
    {
    public:
    	Product();
    	virtual ~Product();
    
    	virtual void func();
    };
    
    class ConcreteProduct : public Product
    {
    public:
    	ConcreteProduct();
    	virtual ~ConcreteProduct();
    
    	virtual void func();
    };
    
    //file: product.cpp
    #include "pch.h"
    #include "Product.h"
    #include <iostream>
    using namespace std;
    
    //Product
    Product::Product() {}
    
    Product::~Product() {}
    
    void Product::func() {}
    
    //ConcreteProduct
    ConcreteProduct::ConcreteProduct() {}
    
    ConcreteProduct::~ConcreteProduct() {}
    
    void ConcreteProduct::func()
    {
    	cout << "Concrete Product's Func ." << endl;
    }
    

    Factory抽象类以及ConcreteFactory具体实现类:

    //file: Factory.h
    #pragma once
    #include "Product.h"
    
    class Factory
    {
    public:
    	Factory();
    	virtual ~Factory();
    	
    	virtual Product* factoryMethod();
    };
    
    class ConcreteFactory : public Factory
    {
    public:
    	ConcreteFactory();
    	virtual ~ConcreteFactory();
    
    	virtual Product* factoryMethod();
    };
    
    //file: Factory.cpp
    #include "pch.h"
    #include "Factory.h"
    
    //Factory
    Factory::Factory() {}
    
    Factory::~Factory() {}
    
    Product* Factory::factoryMethod() 
    {
    	return nullptr;
    }
    
    //ConcreteFactory
    ConcreteFactory::ConcreteFactory() {}
    
    ConcreteFactory::~ConcreteFactory() {}
    
    Product* ConcreteFactory::factoryMethod()
    {
    	return new ConcreteProduct;
    }
    

    客户端代码:

    //file: FactoryMethodPattern.cpp : This file contains the 'main' function. Program execution begins and ends there.
    #include "pch.h"
    #include "Factory.h"
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	Factory* fc = new ConcreteFactory();
    	Product* prod = fc->factoryMethod();
    	prod->func();
    
    	delete fc;
    	delete prod;
    
    	char c;
    	cin >> c;
    	return 0;
    }
    

    C#代码

    Product抽象类以及ConcreteProduct具体实现类:

    public abstract class Product
    {
    	public virtual void Func()
    	{
    		Console.WriteLine("Basic Func Of The Product .");
    	}
    }
    
    public class ConcreteProduct : Product
    {
    	public override void Func()
    	{
    		base.Func();
    		Console.WriteLine("The Concrete Product's External Func .");
    	}
    }
    

    Factory抽象类以及ConcreteFactory具体实现类:

    public abstract class Factory
    {
    	public abstract Product FactoryMethod();
    }
    
    public class ConcreteFactory : Factory
    {
    	public override Product FactoryMethod()
    	{
    		return new ConcreteProduct();
    	}
    }
    

    客户端代码:

    using System;
    
    namespace FactoryMethodPattern
    {
    	class Program
    	{
    		static void Main(string[] args)
    		{
    			Factory fc = new ConcreteFactory();
    			Product prod = fc.FactoryMethod();
    			prod.Func();
    			Console.ReadKey(false);
    		}
    	}
    }
    

    REF

    书籍:

    设计模式与游戏开发、大话设计模式

    GitHub:

    https://github.com/me115/design_patterns

  • 相关阅读:
    为什么单个TCP连接很难占满带宽
    上传NUnit的单元测试结果和OpenCover的单元测试覆盖率到SonarQube服务中
    使用Visual Studio Code Coverage和nunit上传单元测试覆盖率和单元测试结果到SonarQube上
    java安装1.8的经验和Error: Registry key 'SoftwareJavaSoftJava Runtime Environment'CurrentVers问题处理
    NSubstitute.Analyzers检测NSubstitute用法冲突
    在TeamCity中执行gtest单元测试
    iOS OpenGL ES入门
    iOS 基础知识
    【内推】字节跳动-头条小说&番茄小说
    iOS开发小记(十四)
  • 原文地址:https://www.cnblogs.com/sylvan/p/9751059.html
Copyright © 2020-2023  润新知