设计模式-创造(1)-工厂模式、简单工厂模式

设计模式-创造-工厂模式、简单工厂模式

  • 简述
      • 优点
      • 缺点
  • 代码
      • 公共代码
          • Product
          • Product1
          • Product2
          • pom
          • 测试类
      • 工厂模式
          • Factory
          • Factory1
          • Factory2
          • 测试
      • 简单工厂
          • SimpleFactory
          • 测试
  • 总结

简述

工厂模式意图:定义一个创建对象的接口,让其子类决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

但通常使用的是简单工厂模式,下面展示简单工厂的3中实现方式:简单工厂、多方法工厂、静态工厂

简单工厂模式 与 工厂模式的区别?简单工厂模式不是 23 种里的一种,简而言之,就是有一个专门生产某些产品的类。

优点

  • 创建对象方便。根据关键字(比如一个字符串)就可以创建一个对象
  • 扩展性高。增加一个具体类即增加一个产品
  • 封装性。屏蔽产品实现

缺点

  • 每增加一个产品,都需要增加一个具体类和修改工厂工厂,类数不断增加,在一定程度上增加了系统的复杂度

代码

公共代码

Product
public interface Product {

    void productMethod();
}
Product1
public class Product1 implements Product {

    @Override
    public void productMethod(){
        System.out.println("this is product1");
    }
}
Product2
public class Product2 implements Product {

    @Override
    public void productMethod(){
        System.out.println("this is product2");
    }
}
pom

        
        
            junit
            junit
            4.12
            test
        
    
测试类
import com.ydfind.gof.factory.*;
import org.junit.Test;

public class GofPatternTest {
}

工厂模式

Factory
public interface Factory {
    Product createProduct();
}
Factory1
public class Factory1 implements Factory {
    @Override
    public Product createProduct() {
        return new Product1();
    }
}

Factory2
public class Factory2 implements Factory {
    @Override
    public Product createProduct() {
        return new Product2();
    }
}
测试
@Test
public void testFactory(){
     System.out.println("*********************工厂模式 测试********************************");
     Factory factory;
     Product product;
     // 产品A1
     factory = new Factory1();
     product = factory.createProduct();
     product.productMethod();
     // 产品A2
     factory = new Factory2();
     product = factory.createProduct();
     product.productMethod();
 }

简单工厂

SimpleFactory
public class SimpleFactory {

    public static final String PRODUCT_1 = "1";
    public static final String PRODUCT_2 = "2";

    /*******************************简单-工厂*********************************************/
    /**
     * 根据关键字创建对象
     */
    public Product createProduct(String type){
        Product product;
        switch (type){
            case PRODUCT_1:
                product = new Product1();
                break;
            case PRODUCT_2:
                product = new Product2();
                break;
            default:
                product = null;
        }
        return product;
    }

    /*****************************多方法-工厂***********************************************/
    public Product createProduct1(){
        return new Product1();
    }

    public Product createProduct2(){
        return new Product2();
    }

    /*****************************静态-工厂***********************************************/
    public static Product createStaticProduct1(){
        return new Product1();
    }

    public static Product createStaticProduct2(){
        return new Product2();
    }
}
测试
@Test
    public void testSimpleFactory(){
        System.out.println("*********************简单工厂模式 测试********************************");
        SimpleFactory simpleFactory = new SimpleFactory();
        Product product;
        // 简单工厂
        product = simpleFactory.createProduct(SimpleFactory.PRODUCT_1);
        product.productMethod();
        product = simpleFactory.createProduct(SimpleFactory.PRODUCT_2);
        product.productMethod();
        // 多方法工厂
        product = simpleFactory.createProduct1();
        product.productMethod();
        product = simpleFactory.createProduct2();
        product.productMethod();
        // 静态工厂
        product = simpleFactory.createStaticProduct1();
        product.productMethod();
        product = simpleFactory.createStaticProduct2();
        product.productMethod();
    }

总结

工厂模式需要为每个具体产品定义一个工厂类;而简单工厂一个类就搞定了,通常通过一个关键字(比如一个String)来区分创建什么产品对象;

你可能感兴趣的:(设计模式)