java—工厂设计模式(简单工厂模式)(工厂方法模式)(抽象工厂模式)

工厂设计模式(简单工厂模式)(工厂方法模式)(抽象工厂模式)

工厂设计模式介绍:
在这里插入图片描述
实例分析:
我想买一部手机->手机型号有iphone,HUAWEI
分析图如下:
在这里插入图片描述
(一)使用接口的基础方法实现

代码如下:

interface Phone{
	
	void printInfo();
}

class Iphone implements Phone{
	public void printInfo(){
	  System.out.println("这是一部苹果手机。");
	}
}

class Huawei implements Phone{
	public void printInfo(){
		System.out.println("这是一部华为手机。");
	}
}

//客户端
public class Client{
	
	public void buyPhone(Phone phone){
		phone.printInfo();
	}
	
	public static void main(String[] args){
		Client client = new Client();
		client.buyPhone(new Iphone());
	}
}

运行结果如下:
在这里插入图片描述观察以上代码可以发现,手机类型不仅仅只有iPhone和华为,还有vivo,oppo等各种各样的类型,所以当我们不想要iPhone 而想要vivo时,此时修改代码就要在客户端重新进行实例化,让客户端支持vivo手机。
此时我们可以想一个解决办法,就是在拥有各种类型手机的时候,选择我们想要的类型,并且每次重新进行选择时不会每次都在客户端实例化,将客户端代码封装起来。
要想将客户端代码封装起来,即只要将实例化部分单独提取出来。
我们可以为实例化对象单独定义一个类,这个类就用来实例化。可以把这个类想象成一个产生实例化对象的工厂。
这个就是简单工厂模式。
(二)简单工厂模式

代码如下:

//导入包
import java.util.Scanner;
//1.定义接口
interface Phone{
	void printInfo();
}

//2. 子类实现接口
class Iphone implements Phone{
	public void printInfo(){
	  System.out.println("这是一部苹果手机。");
	}
}

class Huawei implements Phone{
	public void printInfo(){
		System.out.println("这是一部华为手机。");
	}
}

//3. 定义实例化工厂
//若有新的需求,则可以在工厂中直接修改
class Factory{
	public static Phone getInstance(String type){
		Phone phone = null;
		if(type.equals("iphone")){
			phone = new Iphone();
		}else{
			phone = new Huawei();
		}
		return phone;
	}
}

//客户端
public class Client{
	
	public void buyPhone(Phone phone){
		phone.printInfo();
	}
	
	public static void main(String[] args){
		Client client = new Client();
		Scanner scanner = new Scanner(System.in);
        System.out.println("请输入您想要的手机型号...");
		String type = scanner.nextLine();
		Phone phone = Factory.getInstance(type);
		client.buyPhone(phone);
		
	}
}

运行结果如下:
在这里插入图片描述对简单工厂模式的总结:
(1)一个抽象产品类
(2)具体实现类
(3)一个实例化工厂
(4)客户端
缺点:不符合开闭原则(对修改关闭,对扩展开放)


所以在此代码的基础上还可以进行优化,避免其缺陷,使其尽量符合开闭原则。
定义一个用来创建对象的接口,让子类决定实例化哪一个类,将实例化延迟到子类。——即工厂方法模式。

(三)工厂方法模式

工厂方法模式是针对每个产品提供一个工厂类,在客户端中判断使用哪个工厂类去创建对象。
我们将之前的 Factory 抽象成一个接口,那么创建相应具体的工厂类(子类)去实现该接口的方法。
代码如下:

//1. 定义产品抽象类
interface Phone{
	void printInfo();
}
//2. 定义多个产品实现类
class Iphone implements Phone{
	public void printInfo(){
	  System.out.println("这是一部苹果手机。");
	}
}

class Huawei implements Phone{
	public void printInfo(){
		System.out.println("这是一部华为手机。");
	}
}

//3. 定义一个抽象工厂类
//该抽象类用来实例化,但是对于具体的实例化交由子类实现,符合开闭原则
interface Factory{
	Phone createPhone();
}

//4.定义多个产品工厂,每个产品类对应的实例化 
class IphoneFactory implements Factory{
	public Phone createPhone(){
		return new Iphone();
	}
}

class HuaweiFactory implements Factory{
	public Phone createPhone(){
		return new Huawei();
	}
}


//客户端
public class Client{
	
	public void buyPhone(Phone phone){
		phone.printInfo();
	}
	
	public static void main(String[] args){
		Client client = new Client();
		Factory factory = new HuaweiFactory();
		client.buyPhone(factory.createPhone());
		
	}
}

运行结果如下:
在这里插入图片描述
观察以上代码会发现,当添加某一类型的新产品时,符合开闭原则,不需要修改原有代码;
但是,当添加一个新的产品类时,依然不符合开闭原则。
工厂方法模式:
(1)一个抽象产品类
(2)多个具体产品类
(3)一个抽象工厂
(4)多个具体工厂(每个具体工厂对应一个具体产品类)


(四)抽象工厂模式

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
工厂方法模式和抽象工厂模式基本类似,可以这么理解:当工厂只生产一个产品的时候,即为工厂方法模式,而工
厂如果生产两个或以上的商品即变为抽象工厂模式。

例如本案例,现在需要添加一个操作系统类,操作系统有Android 和 ios。

具体代码如下:



interface Phone{
	
	void printInfo();
}

class Iphone implements Phone{
	public void printInfo(){
	  System.out.println("这是一部苹果手机。");
	}
}

class Huawei implements Phone{
	public void printInfo(){
		System.out.println("这是一部华为手机。");
	}
}

interface OperationSytem{
	void printSystem();
}

class Android implements OperationSytem{
	public void printSystem(){
		System.out.println("该操作系统是安卓系统。");
	}
}
class Ios implements OperationSytem{
	public void printSystem(){
		System.out.println("该操作系统是iOS操作系统。");
	}
}

interface Factory{
	Phone createPhone();
	OperationSytem createSystem();
}

class AppleFactory implements Factory{
	public Phone createPhone(){
		return new Iphone();
	}
	public OperationSytem createSystem(){
		return new Ios();
	}
}

class OtherFactory implements Factory{
	public Phone createPhone(){
		return new Huawei();
	}
	public OperationSytem createSystem(){
		return new Android();
	}
}


//客户端
public class Client{
	
	public void buyPhone(Phone phone){
		phone.printInfo();
	}
	public void useSystem(OperationSytem operation){
		operation.printSystem();
	}
	
	public static void main(String[] args){
		Client client = new Client();
		
		Factory factory = new AppleFactory();
		client.buyPhone(factory.createPhone());
		client.useSystem(factory.createSystem());
		
	}
}

运行结果如下:
在这里插入图片描述
抽象工厂模式:
(1)多个抽象产品类
(2)具体产品类
(3)抽象工厂类 - 声明(一组)返回抽象产品的方法
(4) 具体工厂类 - 生成(一组)具体产品

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值