Java设计模式之工厂模式

工厂设计模式

1.定义和背景

工厂设计模式:主要是指通过对创建对象的过程的处理,通过将创建对象的过程进行封装,达到对创建对象的灵活处理。采用工厂模式能够实现代码的可扩展和可维护的功能。能降低代码的冗余度。

2.工厂模式常用的类型

    工厂模式常用的类型有三种:
   1. 简单工厂模式(Simple Factory);
   2. 工厂方法模式(Method Factory)
   3. 抽象工厂模式(Abstract Factory)

3.简单工厂模式使用
   简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。比如说注册一个账号,通过手机号码注册,通过邮箱注册或者其他的。对于这种的方式的处理常见的操作就是,定义一个注册的接口,然后实现这个方法,通过不同的逻辑来注册。这就是很简单工厂模式的一个使用场景。
代码如下:
1.注册的接口(registerInterface)
public interface  RegisterInterface {
	
	void register();

}
2.采用电话号码注册类
public class RegisterPhone implements RegisterInterface {


	public void register() {
		System.out.println("采用的是电话号码类注册");
	}


}
3.采用邮箱注册
public class RegisterEmail implements RegisterInterface {

	public void register() {
          System.out.println("采用邮箱注册");
	}
}

4.同意创建对象的工厂类
public class RegisterFactory {

	
	public static RegisterInterface getRegisterInstance(String type){
		if(type.equals("phone")){
			return new RegisterPhone();
		}else if(type.equals("email")){
			return new RegisterEmail();
		}else{
			System.out.println("没有这种注册模式");
			return null;
		}
	}
}

5.测试
public static void main(String[] args) {
		String type =  "phone";
		RegisterInterface register = RegisterFactory.getRegisterInstance(type);
		register.register();
		
		type =  "email";
		 register = RegisterFactory.getRegisterInstance(type);
		register.register();
	}
简单工厂模式总结,简单工厂模式就是创建一个接口提供统一的一个行为,然后各个产品实现该接口创建自己的对象。通过一个管理类来实现个不同参数的对象的创建。简单工厂模式是对共有的行为的封装。

4.工厂方法模式使用及分析

工厂方法模式是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由工厂类决定哪一个产品类应该被实例化,这个决定被交给抽象工厂的子类去做,
  结构:
 1)抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关,是具体工厂角色必须实现的接口或者必须继承的父类,在Java中由接口或者抽象类来实现。
 2)具体工厂角色:它含有和具体业务逻辑相关的代码,由应用程序调用以创建对应的具体产品的对象。
 3)抽象产品角色:它是具体产品继承的父类或者是实现的接口,在Java中是抽象类或者接口实现。
 4)具体产品角色:具体产品角色所创建的对象就是此角色的实例,在Java中由具体的类来实现。 
例如创建汽车的工厂方法模式来实现创建不同厂商的汽车。
代码如下:
 1.创建汽车共有的行为类(Car)
 
public abstract class Car {
   abstract void run();
}
2.创建陆风汽车
public class LuFengCar  extends Car{
	
	public LuFengCar(){
		System.out.println("创建陆风xxx汽车");
	}

	@Override
	void run() {
		System.out.println("陆风汽车跑了");
	}

}
3.创建东风日产
public class NissenCar extends Car {
	
	public NissenCar(){
		System.out.println("创建东风日产-逍客");
	}

	@Override
	void run() {
		
		System.out.println("东风日产跑了");
	}

}
4.创建生产汽车的统一接口
public interface Product {
	//生产汽车
	public Car product();

}
5.创建生产陆风汽车的具体方法
public class FactoryLuFengCar implements Product{


	public Car product() {
		
		return new LuFengCar();
	}
}
6.创建制造东风汽车的具体方法
public class FactoryNissenCar implements Product {

	public Car product() {
		return new NissenCar();
	}
}
7.封装下创建对象的过程。
public class CarFactory {
	public static Car getCarInstance(String type){
		Product product;
		if(type.equals("feng")){
			 product = new FactoryLuFengCar();
			return product.product();
		}else if(type.equals("nissen")){
			 product = new FactoryNissenCar();
			return product.product();
		}else{
			return null;
		}
	}
}
8.测试
public static void main(String[] args) {
	String type = "feng";
	Car car = CarFactory.getCarInstance(type);
	if(car != null){
		car.run();
	}
	}
}
9.运行结果
创建陆风xxx汽车
陆风汽车跑了
总结:工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的父类,这样就分担了对象那个创建的一些功能,而且是结构层次变得灵活起来,当有行的汽车产生时,只需按照抽象产品角色,抽象工厂角色提供的接口规则来生成,这样的会就不会修改已有的代码,该设计模式能够体现了开闭原则,低耦合,高内聚的特点。

5.抽象工厂模式

  抽象工厂模式(Abstract Factory Pattern)是工厂方法模式的进一步抽象,英文翻译是 provider an instance  for creating familities of related or dependent objects without specifying their concrete classes 
  为创建一组相关或相互依赖的对象提供一个借口,无需指定它们的具体类”。抽象工厂模式通常是用于创一族产品,并且这族产品分不同的等级;不同的具体工厂类生产不同等级的一族产品。抽象工厂模式也有四种角色:抽象工厂、具体工厂、抽象产品和具体产品。
代码比如:富士康公司,可以帮你代工做手机,可以 帮你代工做电视,可以帮你代工做电脑,这个做电视是一套做法,做电脑是一套做法,做手机是一套做法,比如说小米现在有要富士康给代工做100万部手机,50万台笔记本电脑,40万台电视机。这个时候就可以采用抽象工作模式来设置对应的数据。
代码如下:
1.制造笔记本的接口
<span style="font-family:Courier New;font-size:18px;">public interface MacBookInterface {
	 void create();</span>
2.制造笔记本的接口
<span style="font-family:Courier New;font-size:18px;">public interface PhoneInterface {
	 void create();
}
}</span>
3.制造电视机的接口
<span style="font-family:Courier New;font-size:18px;">public interface TvInterface {
  void create();
}</span>
4.制造笔记本的具体实现
<span style="font-family:Courier New;font-size:18px;">public class FactoryBook implements MacBookInterface {

	public void create() {
		System.out.println("生产笔记本");
	}
}</span>
5.制造手机的具体实现
<span style="font-family:Courier New;font-size:18px;">public class FactoryPhone implements PhoneInterface {

	public void create() {
		System.out.println("生产手机");
	}
}</span>
6.制造电视的具体实现
<span style="font-family:Courier New;font-size:18px;">public class FactoryTv implements TvInterface{

	public void create() {
		System.out.println("生产电视机");
	}
}</span><span style="font-family: Arial; font-size: 14px;">
</span>
7.创建同意创建多对象的接口
<span style="font-family:Courier New;color:#009900;">public interface ElectoryProductInterface {
	
	public MacBookInterface productBook();
	public PhoneInterface productPhone();
	public TvInterface productTv();

}</span>
8.创建对象的具体实现
<span style="font-family:Courier New;color:#009900;">public class ElectoryFactory  implements ElectoryProductInterface{

	public MacBookInterface productBook() {
		return new FactoryBook();
	}

	public PhoneInterface productPhone() {
		return new FactoryPhone();
	}

	public TvInterface productTv() {
		return new FactoryTv();
	}
}</span>
9.测试
<span style="font-family:Courier New;">public static void main(String[] args) {
		ElectoryProductInterface electory = new ElectoryFactory();
		//创建笔记本
		MacBookInterface book = electory.productBook();
		book.create();
		//创建电视对象
		TvInterface tv = electory.productTv();
		tv.create();
		//创建电话
		PhoneInterface  phone = electory.productPhone();
		phone.create();
	}</span>
10.结果
<span style="font-family:Courier New;color:#009900;">生产笔记本
生产电视机
生产手机</span>
总结:
抽象工厂模式相对于工厂方法模式来说,每个具体工厂可以生产一族产品(即多种产品);而工厂方法模式是具体工厂生产相应的具体产品,只能生产一种产品。当产品族中只有一种产品时抽象工厂模式退化成工厂方法模式。

6.三种工厂模式比较和总结

简单工厂模式,也称为静态工厂模式,该模式能够实现对单层次对象的创建。是工厂方法模式的一种特殊形式。
工厂方法模式,是简单工厂模式的一种抽象化,是将对象的创建封装成了抽象化类或者接口的形式,便于代码的扩展升级和维护。
抽象工厂模式,是工厂发发模式的一种抽象,是将一组或多个对象的创建封装成一个接口来实现的。抽象工厂模式适合于比较发杂的对象的创建,比如说要创建层次有点多的系统比较适合这种设计模式。
总结:三种设计模式各有自己的有点,在使用中结合项目实际来使用。写的不好的请多指正。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值