zoukankan      html  css  js  c++  java
  • 工厂方法模式[Factory Mothod]

    工厂方法模式[Factory Mothod]

    模式定义:

    定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使得一个类的实例化延迟到子类。

    设计模式对稳定的部分提炼出来,成为一种模式。

    应用场景:

    • 1 当你不知道该使用对象的确切类型的时候
    • 2 当你希望库或者框架提供扩展其内部组件的方法时

    主要优点:

    • 1 将具体产品和创建者解耦
    • 2 符合单一职责原则
    • 3符合开闭原则

    工厂方法模式的结构
    工厂方法模式的主要角色如下。
    1:抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
    2:具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
    3:抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
    4:具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

    重构前:

    package factorymethod;
    
    public class FactoryMethod {
        public static void main(String[] args) {
    
            Application application = new Application();
            ProductA product = application.getObject();
            product.method1();
        }
    }
    
    class ProductA {
        public void method1(){
            System.out.println("ProductA.method1 executed.");
        }
    }
    
    class Application{
        private ProductA createProduct(){
            return new ProductA();
        }
        ProductA getObject(){
            //创建一个实例,并返回
            ProductA product = createProduct();
            return product;
        }
    }
    

    简单工厂重构后:

    package factorymethod;
    
    public class FactoryMethod {
        public static void main(String[] args) {
    
            Application application = new Application();
            Product product1 = application.getObject("0");
            Product product2 = application.getObject("1");
            product1.method1();
            product2.method1();
        }
    }
    
    interface Product{
        public void method1();
    }
    
    class ProductA implements  Product{
        //假设method1是稳定的代码
        @Override
        public void method1(){
            System.out.println("ProductA.method1 executed.");
        }
    }
    
    class ProductA1 implements  Product{
        //假设method1是稳定的代码
        @Override
        public void method1(){
            System.out.println("ProductA1.method1 executed.");
        }
    }
    
    
    class SimpleFactory{
        public static Product createProduct(String type){
            if (type.equals("0")){
                return new ProductA();
            }else if(type.equals("1")){
                return new ProductA1();
            }else{
                return null;
            }
        }
    }
    
    class Application{
        private Product createProduct(String type){
    
            return SimpleFactory.createProduct(type) ;
        }
        Product getObject(String type){
            //创建一个实例,并返回
            Product product = createProduct(type);
            return product;
        }
    }
    

    工厂方法的重构:

    package factorymethod;
    
    public class FactoryMethod {
        public static void main(String[] args) {
    
            Application application = new ConcreateProductA1();
            Product product1 = application.getObject();
            product1.method1();
    
        }
    }
    
    interface Product{
        public void method1();
    }
    
    class ProductA implements  Product{
        //假设method1是稳定的代码
        @Override
        public void method1(){
            System.out.println("ProductA.method1 executed.");
        }
    }
    
    class ProductA1 implements  Product{
        //假设method1是稳定的代码
        @Override
        public void method1(){
            System.out.println("ProductA1.method1 executed.");
        }
    }
    
    
    
    
     abstract  class Application{
        abstract Product createProduct();
        Product getObject(){
            //创建一个实例,并返回
            Product product = createProduct();
            return product;
        }
    }
    
    class ConcreteProductA extends Application{
        @Override
        Product createProduct() {
            return new ProductA();
        }
    }
    
    class ConcreteProductA1 extends Application{
        @Override
        Product createProduct() {
            return new ProductA1();
        }
    }
    

    源码中的应用:

    • 静态工厂方法

      Calendar.getInstance()
      java.text.NumberFormat.getInstance()
          
      
    • 工厂方法

      java.net.URLStreamHandlerFactory
      
  • 相关阅读:
    jquery 实现 html5 placeholder 兼容password密码框
    php返回json的结果
    使用PHP读取远程文件
    Sharepoint 自定义字段
    Sharepoint 中新增 aspx页面,并在页面中新增web part
    【转】Sharepoint 2010 配置我的站点及BLOG
    JS 实现 Div 向上浮动
    UserProfile同步配置
    【转】Import User Profile Photos from Active Directory into SharePoint 2010
    Sharepoint 2010 SP1升级后 FIMSynchronizationService 服务无法开启
  • 原文地址:https://www.cnblogs.com/zhoujun007/p/13366991.html
Copyright © 2011-2022 走看看