设计模式之工厂模式

工厂模式分为三种:简单工厂、工厂模式以及抽象工厂模式

    简单工厂模式:以购买鼠标举例,我们建立一个鼠标的接口类,所有的鼠标都继承这个接口类,最后创建工厂类去生产创建的鼠标就是简单工厂模式

package easyFactory;
/**
 * 简单工厂模式
 */
//鼠标的接口类
public interface Mouse {
	
	public void product();
}
package easyFactory;
//雷蛇鼠标
public class RezerMouse implements Mouse {
	@Override
	public void product() {
		System.out.println("生产雷蛇鼠标");
	}
}

package easyFactory;
//罗技鼠标
public class LogitechMouse implements Mouse {
	@Override
	public void product() {
		System.out.println("生产罗技鼠标");
	}
}
package easyFactory;
//工厂类
public class Factory {
	//生产雷蛇
	public static Mouse Rezer() {
		return new RezerMouse();
	}
	//生产罗技
	public static Mouse Logitech() {
		return new LogitechMouse();
	}
}
package easyFactory;
//测试类
public class Test {
	public static void main(String[] args) {
		//生产雷蛇鼠标
		Mouse rezer = Factory.Rezer();
		rezer.product();
		//生产罗技鼠标
		Mouse logitech = Factory.Logitech();
		logitech.product();
	}
}

工厂模式:如果我们想要扩展鼠标的厂商,就必须修改工厂方法,这就违背了闭包的原则,工厂方法就可以避免这一问题。

    还是以购买鼠标为例,我们建立一个鼠标的接口类,所有的鼠标都继承这个接口类,随后建立一个工厂的抽象类,每生产一款鼠标建立一个工厂,继承抽象类,代码如下

package Factory;
/**
 * 工厂模式
 */
public interface Mouse {
	
	public void product();
}

package Factory;
//雷蛇鼠标
public class RezerMouse implements Mouse {
	@Override
	public void product() {
		System.out.println("生产雷蛇鼠标");
	}
}

package Factory;

public class LogitechMouse implements Mouse {
	@Override
	public void product() {
		System.out.println("生产罗技鼠标");
	}
}
package Factory;
//静态工厂类
public abstract class AbstractFactory {
	//静态方法
	public abstract Mouse getMouse();
}

package Factory;
//雷蛇工厂
public class RezerFactory extends AbstractFactory {
	@Override
	public Mouse getMouse() {
		return new RezerMouse();
	}
}

package Factory;
//罗技工厂
public class LogitechFactory extends AbstractFactory {
	@Override
	public Mouse getMouse() {
		return new LogitechMouse();
	}
}
package Factory;
/**
 * 写一个工厂调用类,方便调用
 */
public class FactoryProuct {
	//静态方法不用实例化
	public static AbstractFactory getRezer() {
		return new RezerFactory();
	}
	public static AbstractFactory getLogitech() {
		return new LogitechFactory();
	}
}

package Factory;
//测试类
public class Test {

	public static void main(String[] args) {
		//生产雷蛇鼠标
		AbstractFactory rezer = FactoryProuct.getRezer();
		rezer.getMouse().product();
		//生产罗技鼠标
		AbstractFactory logitech = FactoryProuct.getLogitech();
		logitech.getMouse().product();
	}
}

抽象工厂方法:我认为抽象工厂甚至可以和工厂方法都算作抽象工厂方法,还是以生产鼠标举例,我们在生产鼠标的同时又生产了一款键盘,雷蛇和罗技的工厂同时生产鼠标和键盘,代码如下

package abstractFactory;
//生产鼠标
public interface Mouse {
	
	public void productMouse();
}

package abstractFactory;
//生产雷蛇鼠标
public class RezerMouse implements Mouse {
	@Override
	public void productMouse() {
		System.out.println("生产雷蛇鼠标");
	}
}

package abstractFactory;
//生产罗技鼠标
public class LogitechMouse implements Mouse {
	@Override
	public void productMouse() {
		System.out.println("生产罗技鼠标");
	}
}

package abstractFactory;
//生产键盘
public interface Keyboard {
	
	public void productKeyboard();
}

package abstractFactory;
//生产雷蛇键盘
public class RezerKeyboard implements Keyboard {
	@Override
	public void productKeyboard() {
		System.out.println("生产雷蛇键盘");
	}
}

package abstractFactory;
//生产罗技键盘
public class LogitechKeyboard implements Keyboard {
	@Override
	public void productKeyboard() {
		System.out.println("生产罗技键盘");
	}
}
package abstractFactory;
/**
 * 抽象工厂方法
 */
public abstract class AbstractFactory {
	//生产鼠标
	public abstract Mouse getMouse();
	//生产键盘
	public abstract Keyboard getKeyBoard();
}

package abstractFactory;
//雷蛇工厂
public class RezerFactory extends AbstractFactory {
	@Override
	public Mouse getMouse() {
		return new RezerMouse();
	}
	@Override
	public Keyboard getKeyBoard() {
		return new RezerKeyboard();
	}
}

package abstractFactory;
//罗技工厂
public class LogitechFactory extends AbstractFactory {
	@Override
	public Mouse getMouse() {
		return new LogitechMouse();
	}
	@Override
	public Keyboard getKeyBoard() {
		return new LogitechKeyboard();
	}
}
package abstractFactory;
//写一个工厂调用类,方便调用
public class FactoryProduct {
	//静态方法不用实例化
	public static AbstractFactory Rezer() {
		return new RezerFactory();
	}
	public static AbstractFactory Logitech() {
		return new LogitechFactory();
	}
}

package abstractFactory;
//测试
public class Test {
	
	public static void main(String[] args) {
		//生产雷蛇鼠标
		AbstractFactory rezer = FactoryProduct.Rezer();
		rezer.getMouse().productMouse();
		//生产罗技键盘
		AbstractFactory logitech = FactoryProduct.Logitech();
		logitech.getKeyBoard().productKeyboard();
	}
}

工厂方法的缺点在于,如果我们要新增一项,比如新增耳麦,需要从接口开始加,这就很复杂了

转载于:https://my.oschina.net/u/3782790/blog/1635248

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值