简单工厂模式、工厂方法模式及抽象工厂模式
简单工厂模式:
描述:简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
角色职责:
1.工厂(Creator)角色简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
2.抽象(Product)角色简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
3.具体产品(Concrete Product)角色简单工厂模式所创建的具体实例对象
优缺点:在这个模式中,工厂类是整个模式的关键所在。它包含必要的判断
逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。不难发现,简单工厂模式的缺点也正体现在其工厂类上,由于工厂类集中了所有实例的创建逻辑,所以“高内聚”方面做的并不好。另外,当系统中的具体产品类不断增多时,可能会出现要求工厂类也要做相应的修改,扩展性并不很好。
1 package simpleFactory; 2 3 public class SimpleFactoryTest { 4 5 /** 6 * @param args 7 */ 8 public static void main(String[] args) throws Exception{ 9 Animal dog = AnimalFactory.getAnimal("Dog"); 10 Animal cat = AnimalFactory.getAnimal("Cat"); 11 dog.eat("dog food"); 12 cat.eat("cat food"); 13 } 14 15 } 16 //抽象角色 17 interface Animal{ 18 public void eat(String food); 19 public void walk(String street); 20 } 21 //具体角色 22 class Dog implements Animal{ 23 24 @Override 25 public void eat(String food) { 26 System.out.println("Dog is eating "+food); 27 28 } 29 30 @Override 31 public void walk(String street) { 32 System.out.println("Dog is walking in "+ street); 33 34 } 35 } 36 //具体角色 37 class Cat implements Animal{ 38 39 @Override 40 public void eat(String food) { 41 System.out.println("Cat is eating "+ food); 42 } 43 44 @Override 45 public void walk(String street) { 46 System.out.println(" Cat is waling in "+ street); 47 } 48 } 49 //简单工厂 50 class AnimalFactory { 51 public static Animal getAnimal(String name) throws Exception{ 52 //运用反射的方式获取,影响速度,而且不能放到一个文件中 53 //return (Animal)Class.forName(name).newInstance(); 54 if("Dog".equalsIgnoreCase(name)){ 55 return new Dog(); 56 }else if("Cat".equalsIgnoreCase(name)){ 57 return new Cat(); 58 }else{ 59 System.out.println("There is no this animal"); 60 return null; 61 } 62 } 63 }
工厂方法模式:
描述:工厂方法模式同样属于类的创建型模式又被称为多态工厂模式 。工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
角色职责:
1.抽象工厂(Creator)角色工厂方法模式的核心,任何工厂类都必须实现这个接口。
2.具体工厂( Concrete Creator)角色具体工厂类是抽象工厂的一个实现,负责实例化产品对象。
3.抽象(Product)角色工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
4.具体产品(Concrete Product)角色工厂方法模式所创建的具体实例对象
工厂方法模式和简单工厂模式比较
工厂方法模式与简单工厂模式在结构上的不同不是很明显。工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。
工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口,或者有共同的抽象父类。当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了“开放-封闭”原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。工厂方法模式退化后可以演变成简单工厂模式。
1 package factoryMethod; 2 3 4 5 public class FactoryMethodTest { 6 7 /** 8 * @param args 9 */ 10 public static void main(String[] args) { 11 AnimalFacotry ff = new CatFacotry(); 12 Animal cat = ff.getAnimal(); 13 14 AnimalFacotry ff2 = new DogFacotry(); 15 Animal dog = ff2.getAnimal(); 16 17 cat.eat("catFood"); 18 dog.eat("DogFood"); 19 } 20 21 } 22 //抽象角色 23 interface Animal{ 24 public void eat(String food); 25 public void walk(String street); 26 } 27 28 class Dog implements Animal{ 29 30 @Override 31 public void eat(String food) { 32 System.out.println("Dog is eating "+food); 33 34 } 35 36 @Override 37 public void walk(String street) { 38 System.out.println("Dog is walking in "+ street); 39 40 } 41 } 42 43 class Cat implements Animal{ 44 45 @Override 46 public void eat(String food) { 47 System.out.println("Cat is eating "+ food); 48 } 49 50 @Override 51 public void walk(String street) { 52 System.out.println(" Cat is waling in "+ street); 53 } 54 } 55 //抽象工厂角色 56 interface AnimalFacotry{ 57 public Animal getAnimal(); 58 } 59 //具体工厂角色 60 class DogFacotry implements AnimalFacotry{ 61 62 @Override 63 public Animal getAnimal() { 64 return new Dog(); 65 } 66 67 } 68 //具体工厂角色 69 class CatFacotry implements AnimalFacotry{ 70 71 @Override 72 public Animal getAnimal() { 73 return new Cat(); 74 } 75 76 }
抽象工厂:
假如上面的例子中,如果产品,dog和cat又分了两个种类south和north,如果还使用简单工厂模式的化,会使工厂变的混乱,对扩展性不太好,如果使用抽象工厂模式,可以解决这个问题,可以参考代码如下:
1 public class AbstractFactoryTest { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 AnimalFacotry ff = new CatFacotry(); 8 Animal ncat = ff.getNorthAnimal(); 9 Animal scat = ff.getSouthAnimal(); 10 11 AnimalFacotry ff2 = new DogFacotry(); 12 Animal ndog = ff2.getNorthAnimal(); 13 Animal sdog = ff2.getSouthAnimal(); 14 15 ncat.eat("catFood"); 16 ndog.eat("DogFood"); 17 scat.eat("catFood"); 18 sdog.eat("DogFood"); 19 } 20 21 } 22 23 // 抽象角色 24 interface Animal { 25 public void eat(String food); 26 27 public void walk(String street); 28 } 29 //抽象角色类1 30 interface NorthAnimal extends Animal { 31 32 } 33 //抽象角色类2 34 interface SouthAnimal extends Animal { 35 36 } 37 38 class NorthDog implements NorthAnimal { 39 40 @Override 41 public void eat(String food) { 42 System.out.println("NorthDog is eating " + food); 43 44 } 45 46 @Override 47 public void walk(String street) { 48 System.out.println("NorthDog is walking in " + street); 49 50 } 51 } 52 53 class SouthDog implements SouthAnimal { 54 55 @Override 56 public void eat(String food) { 57 System.out.println("SouthDog is eating " + food); 58 59 } 60 61 @Override 62 public void walk(String street) { 63 System.out.println("SouthDog is walking in " + street); 64 65 } 66 } 67 68 class NorthCat implements NorthAnimal { 69 70 @Override 71 public void eat(String food) { 72 System.out.println("NorthCat is eating " + food); 73 } 74 75 @Override 76 public void walk(String street) { 77 System.out.println(" NorthCat is waling in " + street); 78 } 79 } 80 81 class SouthCat implements SouthAnimal { 82 83 @Override 84 public void eat(String food) { 85 System.out.println("SouthCat is eating " + food); 86 } 87 88 @Override 89 public void walk(String street) { 90 System.out.println("SouthCat is waling in " + street); 91 } 92 } 93 94 // 抽象工厂角色 95 interface AnimalFacotry { 96 public Animal getNorthAnimal(); 97 98 public Animal getSouthAnimal(); 99 } 100 101 // 具体工厂角色 102 class DogFacotry implements AnimalFacotry { 103 104 @Override 105 public Animal getNorthAnimal() { 106 107 return new NorthDog(); 108 } 109 110 @Override 111 public Animal getSouthAnimal() { 112 return new SouthDog(); 113 } 114 115 } 116 117 // 具体工厂角色 118 class CatFacotry implements AnimalFacotry { 119 120 @Override 121 public Animal getNorthAnimal() { 122 123 return new NorthCat(); 124 } 125 126 @Override 127 public Animal getSouthAnimal() { 128 return new SouthCat(); 129 } 130 131 }