工厂方法模式

本文介绍了一种常用的设计模式——工厂方法模式。该模式通过封装类中不变的部分,并将个性化善变的部分提取为独立类,利用依赖注入的方式实现解耦、复用及方便后期维护和扩展的目的。文章详细阐述了其核心结构:抽象工厂、具体工厂、抽象产品和具体产品。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工厂方法模式是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品
这里写图片描述


Java

Creator

public interface Creator {
     Product getProduct();
}

Product

public interface Product {
    void Method();
}

ConcreteCreator

public class ConcreteCreator implements Creator {
       public Product getProduct() {
           return new ConcreteProduct();
       }
}

ConcreteProduct

public class ConcreteProduct implements Product {
    public void Method() {
        System.out.println("ConcreteProduct Method");
    }
}

test

public class test {
    public static void main (String[] args) {
        Creator concreteCreator = new ConcreteCreator();
        concreteCreator.getProduct().Method();
    }
}

C艹

Product

class Product
{
public: virtual void Method() = 0;

};

ConcreteProduct

class ConcreteProduct :public Product
{
public:
    virtual void Method()
    {
        cout << "ConcreteProduct Method" << endl;
    }

};

Creator

class Creator
{
public:
public: virtual Product* getProduct() = 0;

};

ConcreteCreator

class ConcreteCreator : public Creator
{
public:
    virtual Product* getProduct()
    {
        return   new ConcreteProduct();
    }

};

test

int main(int argc, char* argv[])
{
    Creator* creator = new ConcreteCreator();
    Product* Product;
    Product = creator->getProduct();
    Product->Method();
    delete Product;
    system("pause");
    return 0;
}

C井

Creator

 public interface Creator
    {
        Product getProduct();
    }

Product

public interface Product
    {
        void Method();
    }

ConcreteCreator

public class ConcreteCreator : Creator 
    {
        public Product getProduct() 
        {
            return new ConcreteProduct();
        }
    }

ConcreteProduct

 public class ConcreteProduct : Product
    {
        public void Method() 
        {
            Console.WriteLine("ConcreteProduct Method"); 
        }
    }

test

public class Program
    {
        public static void Main(string[] args)
        {
            Creator concreteCreator = new ConcreteCreator();
            concreteCreator.getProduct().Method();
            Console.ReadLine();
        }
    }

JS

var Interface = function(name, methods){ 
if (arguments.length != 2) { 
throw new Error("Interface constructor called with " + arguments.length + 
"arguments,but expected exactyl 2.") 
} 
this.name = name; 
this.methods = []; 
for (var i = 0, len = methods.length; i < len; i++) { 
if (typeof methods[i] !== "string") { 
throw new Error("Interface constructor expects methods names to bo " + 
"passed in asastring."); 
} 
this.methods.push(methods[i]); 
} 
}

Interface.ensureImplements = function(object){ 
if (arguments.length < 2) { 
throw new Error("Function Interface.ensureImplements called with " + arguments.length + 
"arguments,but expected at least 2."); 
} 
for (var i = 1, len = arguments.length; i < len; i++) { 
var inter_face = arguments[i]; 
if (inter_face.constructor !== Interface) { 
throw new Error("Function Interface.ensureImplementsexpects arguments " + 
"two and above to be instances of Interface."); 
} 
for (var j = 0, methodsLen = inter_face.methods.length; j < methodsLen; j++) {

                    var method = inter_face.methods[j];
                    if (!object[method] || typeof object[method] !== 'function') {
                            throw new Error("Function Interface.ensureImplements: object " +
                            "does not implements the " +
                            inter_face.name +
                            "interface.Method " +
                            method +
                            "was not found.");
                    }
            }
    }
}



var ConcreteProduct = function(){}; 
ConcreteProduct.prototype = { 
Method : function(){alert("ConcreteCreator Method");} 
}

var ConcreteCreator = function(){}; 
ConcreteCreator.prototype = { 
getProduct : function(){ 
var concreteProduct = new ConcreteProduct(); 
Interface.ensureImplements(concreteProduct,Product); 
return concreteProduct; 
} 
}

var Creator = new Interface("ConcreteCreator",['getProduct']); 
var Product = new Interface("ConcreteProduct",['Method']);

var obj = new ConcreteCreator();
Interface.ensureImplements(obj,Creator); 
obj.getProduct().Method();

写错了或者写的不好不要打我哟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值