普通工厂:厂商根据客户要求去生产,客户去工厂里(表示要实例化工程类)告诉厂商要什么;
多工厂:厂商在工厂里提供模版,客户自己根据需要自己去工厂里使用模板;
静态工厂:厂商直接将模板摆到商店,客户直接使用模板即可(不需要实例化工厂类);
普通工厂模式
描述
建立一个工厂类,对实现了同一接口的提供一个工厂方法创建对象;
客户告诉厂商想要什么,厂商根据客户要求去生产;
问题
类的创建依赖工厂类,如果想要拓展程序,必须对工厂类进行修改,这就违背了闭包原则;
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| interface Animal { public void say(); }
class Dog implements Animal { @Override public void say(){ Test.printMsg("Dog"); } } class Cat implements Animal { @Override public void say(){ Test.printMsg("Cat"); } }
class MainClass { public Animal mainclass(String type){ if (type.equals("dog")) { return new Dog(); }else if (type.equals("cat")) { return new Cat(); } else { Test.printMsg("Error type"); return null; } } } public class Test { public static void printMsg(String msg){ System.out.println(msg); } public static void main(String[] args){ MainClass maincls = new MainClass(); Animal dog = maincls.mainclass("dog"); dog.say(); Animal cat = maincls.mainclass("cat"); cat.say(); } }
|
多工厂模式
描述
对普通工厂方法模式的改进,提供多个工厂方法,分别创建对象
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| interface Animal { public void say(); }
class Dog implements Animal { @Override public void say(){ Test.printMsg("Dog"); } } class Cat implements Animal { @Override public void say(){ Test.printMsg("Cat"); } }
class MainClass { public Animal dogClass(){ return new Dog(); } public Animal catClass(){ return new Cat(); } } public class Test { public static void printMsg(String msg){ System.out.println(msg); } public static void main(String[] args){ MainClass maincls = new MainClass(); Animal dog = maincls.dogClass(); dog.say(); Animal cat = maincls.catClass(); cat.say(); } }
|
静态工厂模式
描述
将多个工厂模式里的工厂方法置为静态,不需创建实例即可调用
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| interface Animal { public void say(); }
class Dog implements Animal { @Override public void say(){ Test.printMsg("Dog"); } } class Cat implements Animal { @Override public void say(){ Test.printMsg("Cat"); } }
class MainClass { public static Animal dogClass(){ return new Dog(); } public static Animal catClass(){ return new Cat(); } } public class Test { public static void printMsg(String msg){ System.out.println(msg); } public static void main(String[] args){ Animal dog = MainClass.dogClass(); dog.say(); Animal cat = MainClass.catClass(); cat.say(); } }
|