• 一.创建型模式 Factory


    Factory

    引出:为了提高内聚 和 松 耦合 ,我们经常会抽象出一些类的公共接口以形成抽象基类或者接口

         通过声明一个指向基类的指针来指向实际的子类达到多态的目的。 问题:多子类继承抽象基类

        我们需要new XXX来用到子类 。

    • 1. 客户程序员想使用必须知道子类的名字( 系统复杂 可能冲突 可记忆性差等问题  (程序的扩展性和维护变得越来越困难
    • 2. 父类不知道要实例化哪个具体子类。

    Factory 模式的两个最重要的功能:

    • 1)定义创建对象的接口,封装了对象的创建;
    • 2)使得具体化类的工作延迟到了子类中

      声明一个创建对象的接口,并封装了对象的创建过程。

      提供一个对象创建对象的接口,并在子类中提供其具体实现

    #include"Factory.h"
    #include"Product.h"
    #include<iostream>
    using namespace std;
    int main()
    {
        Factory *fact = new ConcreteFactory;
    
        Product *p = fact->createProduct();
        system("pause");
        return 0;
    }
    main
    #include "Factory.h"
    
    
    
    Factory::Factory()
    {
    }
    
    
    Factory::~Factory()
    {
    }
    
    ConcreteFactory::ConcreteFactory()
    {
        cout << "ConcreteFactory" << endl;
    }
    
    ConcreteFactory::~ConcreteFactory()
    {
    }
    
    Product * ConcreteFactory::createProduct()
    {
        return new ConcreteProduct;
    }
    Factory.cpp
    #ifndef FACTORY_H
    #define FACTORY_H
    
    #include"Product.h"
    #include<iostream>
    using namespace std;
    
    
    class Factory
    {
    public:
        Factory();
        virtual Product* createProduct() = 0;
        ~Factory();
    };
    
    class ConcreteFactory:public Factory
    {
    public:
        ConcreteFactory();
        ~ConcreteFactory();
    
        Product* createProduct();
    
    private:
    
    };
    
    
    
    #endif // !FACTORY_H
    Factory.h
    #ifndef PRODUCT_H
    #define PRODUCT_H
    
    
    class Product
    {
    public:
        Product();
        virtual~Product() = 0;
    };
    
    class ConcreteProduct:public Product
    {
    public:
        ConcreteProduct();
        ~ConcreteProduct();
    
    private:
    
    };
    
    
    #endif // !PRODUCT_H
    Product.h
    #include "Product.h"
    #include<iostream>
    
    using namespace std;
    
    
    Product::Product()
    {
    }
    
    
    Product::~Product()
    {
    }
    ConcreteProduct::ConcreteProduct()
    {
        cout << "ConcreteProduct" << endl;
    }
    
    ConcreteProduct::~ConcreteProduct()
    {
    }
    Product.cpp

     局限:不符合开闭原则

        

  • 相关阅读:
    【BZOJ4103】异或运算(THUSC2015)-可持久化trie树+位运算
    【BZOJ4103】异或运算(THUSC2015)-可持久化trie树+位运算
    Tempter of the Bone(dfs+奇偶剪枝)题解
    逃离迷宫(BFS)题解
    Almost Union-Find (并查集+删除元素)题解
    POJ 1182 食物链(并查集+偏移向量)题解
    Connections in Galaxy War (逆向并查集)题解
    A^B mod C (快速幂+快速乘+取模)题解
    hdu1272 小希的迷宫 (并查集)
    大明A+B(大数相加)解题报告
  • 原文地址:https://www.cnblogs.com/jingchu/p/10022185.html
Copyright © 2020-2023  润新知