工厂模式:包括简单工厂模式、工厂方法模式、抽象工厂模式
工厂模式是一种创造型模式,所有的工厂模式都强调一点,就是将对象的创建和使用分离,使系统更加符合单一职责原则,也更有利于对功能的复用和系统的维护
使用工厂类还有一个额外的优点,相对于无法重命名的构造函数,使用工厂可以以一种更加可读的易懂的方式创建对象
<!--华丽的分割-->
简单工厂模式(Simple Factory)
简单工厂模式:定义一个工厂类,根据不同的参数返回不同类的实例,由于简单工厂模式用于创建实例的方法是静态的,所以简单工厂模式也叫静态工厂模式
简单工厂模式分三个角色
Factory:提供创建对象的静态工厂方法
Product:被创建的所有实例的类的抽象,使工厂类只需定义一个通用的工厂方法
ConcreteProduct:具体被创建实例的类
PS~~一般情况下,Factory与Product可以结合在一起使结构更加简洁
1 //Product 2 interface Product{ 3 void action(); 4 } 5 //ProductA 6 class ProductA implements Product{ 7 public void action(){ 8 System.out.println("A"); 9 } 10 } 11 //ProductB 12 class ProductB implements Product{ 13 public void action(){ 14 System.out.println("B") 15 } 16 } 17 //..... 18 //Factory 19 class Factory{ 20 public static Product getProduct(String type){ 21 Product product = null; 22 if(type.equals("A")){ 23 product = new ProductA(); 24 }else if(type.equals("B")){ 25 product = new ProductB(); 26 }else{ 27 System.out.println("No Such Product"); 28 } 29 return product; 30 } 31 }
使用简单工厂模式,在工厂类的创建对象方法中判断逻辑是必须的,在所有对象的类型不多的情况下,简单工厂模式的工厂逻辑不会过于复杂,但类型多的时候,工厂类就显得不利于维护和扩展了,而且工厂类使用了静态方法,使工厂角色无法形成继承的等级结构
<!--华丽的分割-->
工厂方法模式(Factory Method)
工厂方法模式:定义一个用于创建对象的接口,让子类决定将哪一个类实例化
工厂方法模式分四个角色
Factory:具体工厂的抽象,声明工厂方法,用于返回一个产品,所有工厂都必须实现这个抽象类或接口
ConcreteFactory:工厂的具体实现
Product:具体产品的抽象,所有产品的公共父类
ConcreteProduct:产品的具体实现
1 //Product 2 interface Product{ 3 void action(); 4 } 5 //ProductA 6 class ProductA implements Product{ 7 public void action(){ 8 System.out.println("A"); 9 } 10 } 11 //ProductB 12 class ProductB implements Product{ 13 public void action(){ 14 System.out.println("B") 15 } 16 } 17 //..... 18 //Factory 19 interface Factory{ 20 //factory method 21 Product getProduct(); 22 } 23 //FactoryA 24 class FactoryA implements Factory{ 25 public Product getProduct(){ 26 return new ProductA() 27 } 28 } 29 //FactoryB 30 class FactoryB implements Factory{ 31 public Product getProduct(){ 32 return new ProductB() 33 } 34 } 35 //..... 36 //ClientCode 37 public class Client{ 38 public static void main(String[] args){ 39 Factory factoryA = new FactoryA(); 40 Factory factoryB = new FactoryB(); 41 factoryA.getProduct().action(); 42 factoryB.getProduct().action(); 43 } 44 }
PS:为了进一步简化客户端,可以将调用创建对象的方法再封装在Factory抽象类中,然后可以直接把调用Product的逻辑写在封装的方法中
工厂方法模式可以获得很好的扩展性,在需要添加新的Product时,只需要添加相应的Factory就可以,符合开闭原则,但在类个数增多的时候,同样也会给系统带来额外的开销
<!--华丽的分割-->
抽象工厂模式(Abstract Factory)
抽象工厂模式:提供一个创建一系列相关或相互依赖的对象的接口,而无须指定他们具体的类,抽象工厂模式也叫Kit模式
假似有如下对象:圆、三角、方块分别是三种对象,Red、Green、Blue则是三种不同的实现
若使用工厂方法模式,对于每种对象抽象一个工厂,再分别实现每个工厂以创建每个对象,这种方法很灵活,但是,每增加一种具体的实现,类的数量便成对的增加,额外增加了系统的维护成本和运行开销
使用抽象工厂需要有以下两个概念:
产品等级结构:即产品的继承结构
产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,以上面的RGB对象来说,一个产品族可以是Red列的对象
所以,若使用抽象工厂模式,只需要添加三个具体的工厂,每个工厂分别负责Red、Green、Blue族对象的创建,只有在添加产品族时才需要额外添加工厂
抽象工厂模式与工厂方法模式一样,也有四个角色
AbstractFactory:声明一组用于创建一族产品的方法,每个方法对应一种产品
ConcreteFactory:实现了具体的方法,方法中创建的对象属于同一族,每一个产品都位于某个产品等级结构中
AbstractProduct:同一类型产品的声明
ConcreteProduct:实现AbstractProduct,构成产品等级结构
以上述圆、三角形、正方形为例
AbstractFactory的客户端代码
1 public class ClientTest{ 2 public static void main(String[] args){ 3 Factory factory; 4 Circle circle; 5 Triangle triangle; 6 Square square; 7 //Red or Green or Blue 8 factory = new RedFactory(); 9 circle = factory.createCircle(); 10 triangle = factory.createTriangle(); 11 square = factory.createSquare(); 12 } 13 }
PS:各种工厂模式各有特点,应按情况选择符合自身开发的模式