设计模式03--工厂方法

目录

 

1.工厂方法

 2.工厂方法的类图


1.工厂方法

    工厂方法是对简单工厂的一个演进,最重要的是把一个类的实例化延迟到其子类,简单工厂是直接在工厂里实例化的。下面是一个简单工厂的类图:

                                         

 简单工厂不属于23设计模式,更像是一种编码的风格.下面是工厂模式的通用类图:

                                      

    定义:

  

    适用场景:

 

     优点:

  

   缺点:

  

 2.工厂方法的类图

     

     这个图很明显是严格按照工厂方法的类图来实现的,产品抽象和工厂抽象,产品实现和工厂实现。接下来我们可以利用泛型加反射写出更加通用的工厂类。

 产品抽象类(接口):

package com.wx.factorymethod.baseinterface;
 /*
   所有产品的抽象接口
 */
public interface Product {
    public void show();
}

 工厂抽象类(接口):

package com.wx.factorymethod.baseinterface;
 /*
    生产所有种类产品的抽象工厂接口
 */
public abstract class FactoryMethod {
     /*
      这里对传入参数做了两层限制,采用的是泛型做限制
      1.传入的参数必须是Class类型
      2.传入的参数必须是Product的实现类
     */
    public abstract <T extends Product> T getProuect(Class<T> c);
}

 产品实现类 

package com.wx.factorymethod.test;

import com.wx.factorymethod.baseinterface.Product;

public class Product1 implements Product {
    @Override
    public void show() {
        System.out.print("产品1的方法被调用");
    }
}


package com.wx.factorymethod.test;

import com.wx.factorymethod.baseinterface.Product;

public class Product2 implements Product {
    @Override
    public void show() {
        System.out.print("产品2的方法被调用");
    }
}

 工厂实现类

package com.wx.factorymethod.imp;

import com.wx.factorymethod.baseinterface.FactoryMethod;
import com.wx.factorymethod.baseinterface.Product;

public class FactoryMethodImp extends FactoryMethod  {
    @Override
    public <T extends Product> T getProuect(Class<T> c) {
        Product product=null;
        try{

            product=(T)Class.forName(c.getName()).newInstance();
        }catch (Exception e)
        {e.printStackTrace();}
        return (T) product;
    }
}

 测试:

package com.wx.factorymethod.test;

import com.wx.factorymethod.baseinterface.FactoryMethod;
import com.wx.factorymethod.imp.FactoryMethodImp;

public class TestFactoryMethod {
    public static void main(String[] args)
    {
        FactoryMethod factoryMethod=new FactoryMethodImp();
        Product1 prouect = factoryMethod.getProuect(Product1.class);
        Product2 product2 = factoryMethod.getProuect(Product2.class);
        prouect.show();
        product2.show();
    }
}

 结果:

这是一个比较通用的工厂方法模式可以对其进行弱化和强化

发布了217 篇原创文章 · 获赞 70 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_37650458/article/details/103225428