zoukankan      html  css  js  c++  java
  • 工厂模式(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:各种工厂模式各有特点,应按情况选择符合自身开发的模式

  • 相关阅读:
    利用智能手机(Android)追踪一块磁铁(三)
    利用智能手机(Android)追踪一块磁铁(二)
    利用智能手机(Android)追踪一块磁铁(一)
    android音频发生器
    接口的作用(java)
    Botposter.com集群ETCD2.3.7升级至3.0实录[原创]
    springboot2+jpa+hikari+oracle实战
    Nginx配置详解
    Nginx安装启动+springboot项目实现负载均衡实战
    springboot使用websocket进行实时传送信息实战(包含服务端和客户端)
  • 原文地址:https://www.cnblogs.com/toddy-bear/p/3372397.html
Copyright © 2011-2022 走看看