1.简单工厂模式
专门定义一个类用来创建其它类的实例,被创建的实例通常都具有共同的父类。
我们若以买电脑为例,假设客户中意MacbookPro,SurfaceBook。这里我们相当于是创建生产电脑的工厂,客户需要购买什么样的电脑,只要输入类型编号就可以获取该电脑。将类 的实例化交给工厂易于解耦。
import java.util.Scanner;
interface Computer
{
void printComputer();
}
class MacbookProComputer implements Computer
{
public void printComputer()
{
System.out.println("This is a MacbookPro");
}
}
class SurfaceBookComputer implements Computer
{
public void printComputer()
{
System.out.println("This is a SurfaceBook");
}
}
class ComputerFactory
{
public static Computer getInstance(String type)
{
Computer computer = null;
if (type.equals("macbook"))
{
computer = new MacbookProComputer();
}
else if (type.equals("surface"))
{
computer = new SurfaceBookComputer();
}
return computer;
}
}
public class Client
{
public void buyComputer(Computer computer)
{
computer.printComputer();
}
public static void main(String[] args)
{
Client client = new Client();
Scanner scanner = new Scanner(System.in);
System.out.println("请输入您想要的电脑型号...");
String type = scanner.nextLine();
Computer computer = ComputerFactory.getInstance(type);
client.buyComputer(computer);
}
}
优点:
简单易于实现 把类的实例化交给工厂,易于解耦。
缺点:
添加具体产品需要修改工厂违反OCP开放封闭原则 。
2.工厂方法模式:
定义一个用来创建对象的接口,让子类决定实例化哪一个类,让子类决定实例化延迟到子类。
工厂方法模式是简单工厂的扩展,工厂方法模式把原先简单工厂中的实现那个类的逻辑判断交给了客户端, 如果像添加功能只需要修改客户和添加具体的功能,不用去修改之前的类。
仍然以买电脑为例:
以下为工厂方法模式的代码,将工厂类作为一个接口,延迟到子类去具体实现。
interface Computer
{
void printComputer();
}
class MacbookProComputer implements Computer
{
public void printComputer()
{
System.out.println("This is a MacbookPro");
}
}
class SurfaceBookComputer implements Computer
{
public void printComputer()
{
System.out.println("This is a SurfaceBook");
}
}
interface ComputerFactory
{
Computer createComputer();
}
class MsFactory implements ComputerFactory
{
public Computer createComputer()
{
return new SurfaceBookComputer();
}
}
class AppleFactory implements ComputerFactory
{
public Computer createComputer()
{
return new MacbookProComputer();
}
}
public class Client
{
public void buyComputer(Computer computer)
{
computer.printComputer();
}
public static void main(String[] args)
{
Client client = new Client();
ComputerFactory factory = new AppleFactory();
client.buyComputer(factory.createComputer());
}
}
优点:
降低了代码耦合度,对象的生成交给子类去完成 实现了开放封闭原则
每次添加子产品 不需要修改原有代码
缺点:
增加了代码量,每个具体产品都需要一个具体工厂 当增加抽象产品 也就是添加一个其他产品族 需要修改工厂 违背OCP (开闭原则(OCP): 一个软件实体如类、模块和函数应该对扩展开放、对修改关闭)。
3.抽象工厂模式
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类,
工厂方法模式和抽象工厂模式基本类似,可以这么理解:当工厂只生产一个产品的时候,即为工厂方法模式,而工 厂如果生产两个或以上的商品即变为抽象工厂模式。
优点:
代码解耦
实现多个产品族(相关联产品组成的家族),而工厂方法模式的单个产品,可以满足更多的生产需求
很好的满足OCP开放封闭原则
抽象工厂模式中我们可以定义实现不止一个接口,一个工厂也可以生成不止一个产品类 对于复杂对象的生产 相当灵活易扩展
缺点:
扩展产品族相当麻烦 而且扩展产品族会违反OCP ,因为要修改所有的工厂 由于抽象工厂模式是工厂方法模式的扩展 总体的来说 很笨重