目录
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();
}
}
结果:
这是一个比较通用的工厂方法模式可以对其进行弱化和强化