工厂方法模式是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品
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();
写错了或者写的不好不要打我哟