@Tyhj
2018-08-01T15:16:36.000000Z
字数 1577
阅读 1026
设计模式
由一个工厂对象决定创建出哪一种产品的实例。
一个计算机代工生产商,代工生产多种电脑
抽象产品类
public abstract class Computer {
/**
* 产品的抽象方法
*/
public abstract void start();
}
具体产品类
public class HpComputer extends Computer {
@Override
public void start() {
Log.e("factory", "惠普计算机启动");
}
}
public class LenovoComputer extends Computer {
@Override
public void start() {
Log.e("factory", "联想计算机启动");
}
}
工厂类
public class ComputerFactory {
public static Computer createComputer(String type) {
Computer computer = null;
switch (type) {
case "lenovo":
computer = new LenovoComputer();
break;
case "hp":
computer = new HpComputer();
break;
default:
break;
}
return computer;
}
}
客户端调用工厂类:
public class CreateComputer {
public static void main(String args[]){
ComputerFactory.createComputer("hp").start();
}
}
使用场景:
- 工厂类负责创建的对象比较少
- 客户端只需要知道传入工厂类的参数,而无需关心创建对像的逻辑
优点:用户根据参数获取对应的类实例,避免了直接实例化对象,降低耦合
缺点:可实例化的类型在编译期间被确定了,如果新增类型,需要修改工厂,违背了开闭原则
简单工厂需要知道所有要生成的类型,当子类过多的时候不适合使用
定义:定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。
工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品 1
创建抽象工厂:
public abstract class ComputerFactory {
public abstract <T extends Computer> T createComputer(Class<T> clz);
}
具体工厂:
public class GDComputerFactor extends ComputerFactory {
@Override
public <T extends Computer> T createComputer(Class<T> clz) {
Computer computer=null;
String classname=clz.getName();
try {
//通过反射来生产不同厂家的计算机
computer= (Computer) Class.forName(classname).newInstance();
}catch (Exception e){
e.printStackTrace();
}
return (T) computer;
}
}
Class cla=Class.forName("java.lang.String");//初始化
Object obj=cla.newInstance();//实例化为object类
String str=(String)obj;//向下转换回子类
如果需要新的计算机,只需要创建产品就好了,无需修改其他方法