一 . 简单工厂模式
1.Factory:工厂类,负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
2.IProduct:抽象产品类,这是简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
3.Product:具体产品类,这是简单工厂模式的创建目标。
1.简单工厂模式的简单实现
(1)抽象产品类
我们创建一个计算机的抽象产品类,其有一个抽象方法用于启动计算机
public abstract class Computer
{
abstract void start();//定义成抽象方法是为了所有都要重写该方法
}
(2)具体产品类
接着创建各个品牌的计算机,其都继承了自己的父类Comuter,并实现了父类的start方法,具体的计算机产品分别是联想,惠普。
public class LeComputer
{
public static class LeComputer2 extends Computer
{
@Override
void start()
{
}
}
public static class LeComputer3 extends Computer
{
@Override
void start()
{
}
}
}
(3)工厂类
接下来创建一个工厂类,它提供了一个静态方法creatComputer用来生产计算机,你只需要传入自己想生产的计算机的品牌,他就会实例化相应的计算机对象
public class ComputerFac
{
public static Computer createComputer(String type)
{
Computer computer = null;
switch (type)
{
case "leve":
computer = new LeComputer.LeComputer2();
break;
case "lsls":
computer = new LeComputer.LeComputer3();
break;
}
return computer;
}
}
(4)调用工厂类
传入对应的type则调用对应的Computer方法
public static void main(String[] args)
{
ComputerFac.createComputer("le").start();
}
2 使用简单工厂模式的场景和优缺点
使用场景:
工厂类负责创建的对象比较少
客户只需知道传入工厂类的参数,而无须关心创建对象的逻辑
优点:使用户根据参数获得对应的类实例,避免了直接实例化类,降低了耦合性。
缺点:可实例化的类型在编译期间已经被确定。如果增加新类型,则需要修改工厂,这违背了开放封闭原则。当子类过多或者子类层次过多时不适合使用。
3 工厂方法模式
定义:定义一个用于创建对象的接口,让子类决定实例化哪个类,工厂方法使一个类的实例化延迟到其子类。
1.工厂方法模式的简单实现
(1)创建抽象工厂
抽象工厂里面有一个creatComputer方法,想生产哪个品牌的计算机就生产哪个品牌的
public abstract class Computeractory
{
public abstract <T extends Computer> T createComputr(Class<T> clz);
}
(2)具体工厂
广达代工厂是一个具体的工厂,其继承抽象工厂,通过反射来生产不同厂家的计算机
public class GDComputerFactor extends Computeractory
{
@Override
public <T extends Computer> T createComputr(Class<T> clz)
{
Computer computer = null;
String classname = clz.getName();
try
{
computer = (Computer) Class.forName(classname).newInstance();
} catch (IllegalAccessException e)
{
e.printStackTrace();
} catch (InstantiationException e)
{
e.printStackTrace();
} catch (ClassNotFoundException e)
{
e.printStackTrace();
}
return (T) computer;
}
}
(3)客户端创建GDC,并分别生产
public class Client
{
public static void main(String[] args)
{
Computeractory computeractory = new GDComputerFactor();
LeComputer.LeComputer2 computer = computeractory.createComputr(LeComputer.LeComputer2.class);
computer.start();
}
}
工厂方法与简单工厂
对于简单工厂模式,我们都知道其在工厂类中包含了必要的逻辑判断,根据不同的条件动态实例化相关的类,对于客户端,只要增加新的对象就在工厂类中添加一个新的Case ,工厂方法模式没有违背这个开放封闭原则。直接在里面创建产品