@Tyhj
        
        2018-08-01T07:16:36.000000Z
        字数 1577
        阅读 1292
    设计模式

由一个工厂对象决定创建出哪一种产品的实例。
一个计算机代工生产商,代工生产多种电脑
抽象产品类
public abstract class Computer {/*** 产品的抽象方法*/public abstract void start();}
具体产品类
public class HpComputer extends Computer {@Overridepublic void start() {Log.e("factory", "惠普计算机启动");}}public class LenovoComputer extends Computer {@Overridepublic 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 {@Overridepublic <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;//向下转换回子类
如果需要新的计算机,只需要创建产品就好了,无需修改其他方法
