简单工厂模式
基本介绍
简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单使用的模式
简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)
在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式
代码实现
/**
* @author huangqh
* @create 2020/9/10 0:42
* @Note 简单工厂
*/
public class SimpleFactoryTest {
public static void main(String[] args) {
App qq = SendFactory.getInstance().create("QQ");
qq.send("HHHHH");
App weChat = SendFactory.getInstance().create("WeChat");
weChat.send("OHHHHH");
}
}
//Application 抽象类
abstract class App{
abstract void send(String msg);
}
//Application 实现类 WeChat
class Wechat extends App{
void send(String msg) {
System.out.println("Wechat send :"+msg);
}
}
//Application 实现类 QQ
class QQ extends App{
void send(String msg) {
System.out.println("QQ send :"+msg);
}
}
//
class SendFactory{
//匿名内部类 单例
private SendFactory(){
}
static class InnerClass{
private static final SendFactory INSTANCE =new SendFactory();
}
public static SendFactory getInstance(){
return InnerClass.INSTANCE;
}
//根据传参 工厂创建不同对象
App create(String app){
if ("QQ".equals(app))
return new QQ();
else if ("WeChat".equals(app))
return new Wechat();
else
return null;
}
}
工厂方法模式
基本介绍
工厂方法模式:定义一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类
代码实现
/**
* @author huangqh
* @create 2020/9/11 0:18
* @Note 工厂方法
*/
public interface Maker {
void process(String material);
}
//生产键盘
class Keyboard implements Maker {
public void process(String material) {
System.out.println("use " + material + " maker keyboard");
}
}
//生产鼠标
class Mouse implements Maker {
public void process(String material) {
System.out.println("use " + material + " maker mouse");
}
}
//抽象工厂
abstract class Factory{
//子类来实例化具体对象
public abstract Maker maker();
public void process(String material){
Maker maker = maker();
maker.process(material);
}
}
class KeyboardFactory extends Factory{
//键盘制造工厂,只需要提供键盘制造设备
public Maker maker() {
return new Keyboard();
}
}
class MouseFactory extends Factory{
//鼠标制造工厂,只需要提供鼠标制造设备
public Maker maker() {
return new Mouse();
}
}
抽象工厂模式
基本介绍
抽象工厂模式:定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体实现的类
抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合
从设计层面看,抽象工厂模式就是对简单工厂模式的改进
将工厂抽象成两层,AbsFactory(抽象工厂)和具体实现的工厂子类。程序员可以根据对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展
代码示例
/**
* @author huangqh
* @create 2020/9/11 1:03
* @Note 键盘 联想键盘和惠普键盘是同一等级(类别)的产品 联想键盘和联想鼠标是同一个产品簇
*/
//机器:用于生产键盘
public interface KeyBoardMachine {
public void process(String material);
}
//用于生产惠普键盘
class HPKeyBoard implements KeyBoardMachine{
public void process(String material) {
System.out.println("使用 "+material+" 生产惠普键盘");
}
}
//用于生产联想键盘
class LenovoKeyBoard implements KeyBoardMachine{
public void process(String material) {
System.out.println("使用 "+material+" 生产联想键盘");
}
}
//机器 用于生产鼠标
interface MouseMachine{
public void process(String material);
}
//生产惠普鼠标
class HPMouse implements MouseMachine{
public void process(String material) {
System.out.println("使用 "+material+" 生产惠普鼠标");
}
}
//生产联想鼠标
class LenovoMouse implements MouseMachine{
public void process(String material) {
System.out.println("使用 "+material+" 生产联想鼠标");
}
}
//抽象工厂
abstract class Factory{
//生产键盘
abstract KeyBoardMachine produceKeyBoard();
//生产鼠标
abstract MouseMachine produceMouse();
}
//联想工厂 生产联想鼠标和键盘
class LenovoFactory extends Factory{
KeyBoardMachine produceKeyBoard() {
return new LenovoKeyBoard();
}
MouseMachine produceMouse() {
return new LenovoMouse();
}
}
//惠普工厂 生产惠普鼠标和键盘
class HPFactory extends Factory{
KeyBoardMachine produceKeyBoard() {
return new HPKeyBoard();
}
MouseMachine produceMouse() {
return new HPMouse();
}
}
class Test{
public static void main(String[] args) {
Factory lenovoFactory = new LenovoFactory();
lenovoFactory.produceKeyBoard().process("亚克力");
lenovoFactory.produceMouse().process("亚克力");
Factory hpFactory = new HPFactory();
hpFactory.produceKeyBoard().process("亚克力");
hpFactory.produceMouse().process("亚克力");
}
}
工厂模式小结
工厂模式的意义:将实例化对象的代码提取出来,放在一个类中同一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展性和维护性
三种工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式
设计模式的依赖抽象原则
创建对象实例时,不要直接new类,而是把这个new类的动作放在一个工厂的方法中,并返回,有的书上说,变量不要直接持有具体类的引用
不要让类继承具体类,而是继承抽象类或是实现interface
不要覆盖基类中已经实现的方法