工厂模式(Factory)

工厂模式:包括简单工厂模式、工厂方法模式、抽象工厂模式

工厂模式是一种创造型模式,所有的工厂模式都强调一点,就是将对象的创建和使用分离,使系统更加符合单一职责原则,也更有利于对功能的复用和系统的维护

使用工厂类还有一个额外的优点,相对于无法重命名的构造函数,使用工厂可以以一种更加可读的易懂的方式创建对象

<!--华丽的分割-->

简单工厂模式(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 }
SimpleFactory

使用简单工厂模式,在工厂类的创建对象方法中判断逻辑是必须的,在所有对象的类型不多的情况下,简单工厂模式的工厂逻辑不会过于复杂,但类型多的时候,工厂类就显得不利于维护和扩展了,而且工厂类使用了静态方法,使工厂角色无法形成继承的等级结构

<!--华丽的分割-->

工厂方法模式(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 }
FactoryMethod

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 }
Client

PS:各种工厂模式各有特点,应按情况选择符合自身开发的模式

原文地址:https://www.cnblogs.com/toddy-bear/p/3372397.html