工厂设计模式有三种,一种是简单工厂模式,一种是工厂方法模式,还有一种是抽象工厂模式,下面对三种工厂模式做一个简单总结
简单工厂模式
定义:专门定义一个类用来创建其他类的实例,被创建的实例通常都具有共同的父类
以买电脑为例,客户需要什么电脑,只需要输入类型编号就能获取该电脑,类图如下所示
package www.cqw.java;
import java.util.Scanner;
interface Computer{
void printcomputer();
}
class MacbookProComputer implements Computer {
public void printcomputer() {
System.out.println("这是一台MacbookPro");
}
}
class SurfaceBookComputer implements Computer{
public void printcomputer(){
System.out.println("这是一台SurfaceBook");
}
}
//如果需要更多选择,以下为例增加其他类
class AlienwareComputer implements Computer{
public void printcomputer(){
System.out.println("这是一台Alienware");
}
}
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();
}else if(type.equals("Alienware")){
computer = new AlienwareComputer();
}
return computer;
}
}
public class Client {
public void buy(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.buy(computer);
}
}
组成
一个抽象产品类
N个具体产品类
一个工厂类
简单工厂模式优点
简单易于实现
把类的实例化交给工厂,易于解耦
简单工厂模式缺点
违反了ocp开放封闭原则
工厂方法模式
定义一个用来创建对象的接口,让子类决定实例化哪一个工厂
package www.cqw.java;
import java.util.Scanner;
interface Computer{
void printcomputer();
}
class MacbookProComputer implements Computer {
public void printcomputer() {
System.out.println("这是一台MacbookPro");
}
}
class SurfaceBookComputer implements Computer{
public void printcomputer(){
System.out.println("这是一台SurfaceBook");
}
}
class AlienwareComputer implements Computer{
public void printcomputer(){
System.out.println("这是一台Alienware");
}
}
interface ComputerFactory{
Computer creatComputer = null;
}
class MsFactory implements ComputerFactory{
public Computer creatComputer(){
return new SurfaceBookComputer();
}
}
class AppleFactory implements ComputerFactory {
public Computer creatComputer() {
return new MacbookProComputer();
}
}
public class Client {
public static void main(String[] args) {
ComputerFactory factory = new AppleFactory();
Computer computer = ((AppleFactory) factory).creatComputer();
computer.printcomputer();
}
}
组成
一个抽象产品类
多个具体产品类
一个抽象工厂
多个具体工厂(每个产品族对应一个具体工厂)
工厂方法模式优点
降低了代码耦合度,对象的生成交给子类完成
实现了开放封闭原则,每次添加子产品不需要修改原有代码
工厂方法模式缺点
增加了代码量,每个具体产品都需要一个具体工厂
当增加产品抽象也就是添加一个其他产品族需要修改工厂,违背ocp
抽象工厂模式
提供一个创建一系列相关或相互依赖对象的接口(抽象工厂,多条产品线),而无需指定他们具体的类